2013-06-11 2 views
0

Я сейчас работаю над проектом, и я вхожу в липкую ситуацию. Я пытаюсь сделать генерировать восемь последовательных случайных чисел но с уловом. Значение между одним и другим не должно превышать пяти, и число не должно повторяться. Например:Java - случайный выбор из уже определенных целых чисел

5 5 3 12 would need to be: 5 (Something else) 3 (Something else) 

Я бежал назад и вперед с помощью опции Random(), но не могу показаться, чтобы получить эту работу. Поэтому я решил предопределить целые числа, чтобы Random мог выбирать между ними.

int One = 1, Two = 3, Three = 5, Four = 7, Five = 8; 
Random RNumber = new Random(); 
int RInteger = RNumber.nextInt(One, Two, Three, Four, Five); 

Да, и, как вы, наверное, знаете ... Это не работает. Теперь я всего лишь новичок на Java, поэтому я прошу вас дать совет. Или, чтобы сообщить мне, не знаю, я правильно подошел к этому вопросу. Заранее благодарим за хороший день.

В случае, если вас это интересует. Ошибка:

No suitable method found for nextInt(int, int, int, int, int) 
method Random.nextInt(int) is not applicable 
+2

'Random.nextInt (интермедиат)' принимает один 'int', вы передаете 5 есть !!! – NINCOMPOOP

+0

Когда вы говорите, что номер не должен повторяться, вы имеете в виду последнее значение или любое значение, полученное до сих пор? –

+0

Последнее значение. Я сейчас смотрю на ваш ответ. Благодаря! – lovromirnik

ответ

0

NextInt принимает максимальное число, в котором вы нуждаетесь. Например, цифры 0-20. nextInt (20) (это даст только случайное значение от 0 до 20. Вы не можете сделать больше одного числа.

Чтобы сделать то, что вам нужно, сделайте массив целых чисел (5,10,20 и т. д.).) ... Тогда сделайте nextInt (array.size()). Это даст вам индекс для случайного числа. Тогда получит число от этого индекса.

Arraylist<Integer> randomNumbers = new Arraylist<Integer>(); 
randomNumbers.add(5); 
randomNumbers.add(10); 
randomNumbers.add(15); 

Random gen = new Random(); 
int index = gen.nextInt(randomNumbers.size()); 

int randomInt = randomNumbers.get(index); 
2

Если вы хотите, чтобы получить случайный Интс из определенный список целых чисел затем помещает Integers внутри List и затем перетасовывает его с помощью метода Collections.shuffle. Получите первый элемент списка, а затем удалите из списка последний номер, который вы берете, и повторите процесс.

код образца, который использует то, что я сказал, и проверяет цифры Maximun разница составляет 5:

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 


public class RandomNumbers { 

    public static int OFFSET = 5; 

    public static void main(String[] s){ 
     RandomNumbers rn = new RandomNumbers(); 
     int prev = 20; //Set prev randomly or any way you want to initialize the list 
     for (int i = 0; i < 10; i++){ 
      prev = rn.getRandomWithinOffset(prev); 
      System.out.println(prev); 
     } 
    } 

    private int getRandomWithinOffset (int prev){ 
     List<Integer> listNumbers = new ArrayList<Integer>(); 
     for (int i = prev -OFFSET; i < prev + OFFSET; i++){ 
      listNumbers.add(i); 
     } 
     listNumbers.remove(new Integer(prev)); 
     Collections.shuffle(listNumbers); 
     return listNumbers.get(0); 
    } 

} 
+1

Как бы вы обеспечили максимальную разницу в 5? –

+0

Я старался не писать полный код для ОП и только показать ему возможный способ самостоятельно решить свою проблему. Но так как вы спросили, и я получил downvoted, я разместил образец кода :) – Averroes

1

Сделайте свою собственную функцию:

public generatePseudoRandom(int currentInt) { 
    Random random= new Random(); 
    Integer result= null; 
    while (result == null || result.intValue() < currentInt - 5 || result.intValue() > currentInt + 5 || result.intValue() == currentInt) { 
     result = random.nextInt(current + 5); 
    } 
    return result; 
} 

Он будет генерировать новые номера, пока его в пределах вашей границы из пяти.

5

Я хотел бы использовать цикл как

public static List<Integer> generate(int count, int maxDiff, int min, int max) { 
    Set<Integer> ret = new LinkedHashSet<Integer>(); 
    Random rand = new Random(); 
    int last = rand.nextInt(max - min + 1) + min; 
    ret.add(last); 
    while(ret.size() < count) { 
     int next = rand.nextInt(max - min + 1) + min; 
     if (Math.abs(next - last) <= maxDiff) { 
      ret.add(next); // will ignore duplicates 
      last = next; 
     } 
    } 
    return new ArrayList<Integer>(ret); 
} 
0

Так привет Everbody еще раз. Я играл с вашими ответами и нашел их очень интересными и полезными. Однако я упомянул, что только что начал программировать, поэтому мне было сложно понять, как они работают. В свете этого я решил поиграть и попытаться создать свою собственную версию. Это то, что я придумал.

import java.util.Random; 

public class Main 
{ 
    public static void main(String[] args) 
    { 
     int RInteger, Loop1 = 0, Loop2 = 0, Loop3 = 0; 
     Random RNumber = new Random(); 
     while (Loop1 == 0) //Generate the first number 
     { 
      RInteger = RNumber.nextInt(8); 
      if (RInteger == 1) 
      { 
       Loop1 = 1; 
      } 
      if (RInteger == 5) 
      { 
       Loop1 = 5; 
      } 
      if (RInteger == 7) 
      { 
       Loop1 = 7; 
      } 
     } 
     while (Loop2 == 0) //Generates the second number making sure no duplicates are present and the maximum difference of 5 
     { 
      RInteger = RNumber.nextInt(8); 
      if (RInteger == 1 && (RInteger != Loop1) && (RInteger - Loop1) <= 5 && (RInteger - Loop1) >= -5) 
      { 
       Loop2 = 1; 
      } 
      if (RInteger == 5 && (RInteger != Loop1) && (RInteger - Loop1) <= 5 && (RInteger - Loop1) >= -5) 
      { 
       Loop2 = 5; 
      } 
      if (RInteger == 7 && (RInteger != Loop1) && (RInteger - Loop1) <= 5 && (RInteger - Loop1) >= -5) 
      { 
       Loop2 = 7; 
      } 
     } 
     while (Loop3 == 0) //A repeat of Loop2 with changed Loop1s into Loop2s and Loop2s into Loop3s 
     { 
      RInteger = RNumber.nextInt(8); 
      if (RInteger == 1 && (RInteger != Loop2) && (RInteger - Loop2) <= 5 && (RInteger - Loop2) >= -5) 
      { 
       Loop3 = 1; 
      } 
      if (RInteger == 5 && (RInteger != Loop2) && (RInteger - Loop2) <= 5 && (RInteger - Loop2) >= -5) 
      { 
       Loop3 = 5; 
      } 
      if (RInteger == 7 && (RInteger != Loop2) && (RInteger - Loop2) <= 5 && (RInteger - Loop2) >= -5) 
      { 
       Loop3 = 7; 
      } 
     } 
     System.out.println(Loop1 + " " + Loop2 + " " + Loop3); 
    } 
} 

Это полностью функциональный, но очень неэффективный. Если нужно добавить больше чисел, соответственно следует выполнить соответствующие ifs. Еще один цикл для каждого дополнительного номера.

Я надеюсь, что это поможет кому-то. Опять же, спасибо за все ваши ответы.

Отличный день.

0

Кажется, это всего лишь вопрос создания случайного числа между -5 и 5 и добавления его к последнему номеру в списке. Просто убедитесь, что число не равно 0, поэтому последнее число не повторяется.

псевдокод:

Let n = random number 
output n 
repeat { 
    repeat { 
    Let r = random number between -5 and 5 
    } until (r != 0) 
    next_n = n + r 
    output next_n 
    n = next_n 
} until (enough numbers are output) 
Смежные вопросы