Как случайным образом генерировать целые числа от 0 до 3, не делая их последовательными в Java? - PullRequest
1 голос
/ 20 марта 2020

До сих пор мне удавалось генерировать случайные числа, используя Random.

for(int i=0; i<10; i++){
    prevnum = num;
    num = random.nextInt(4);
    num = num==prevnum?ran.nextInt(4):num;
    System.out.println("random number: " + num);
}

Я не хочу последовательных повторов, что мне делать?

EDIT / РЕШЕНИЕ:

Я решил проблему с помощью этого обходного пути.

Путем проверки, запущен ли он впервые, чтобы избежать нулевого исключения.

И просто использовал ArrayList, чтобы удалить любые шансы на повторение, удалив предыдущее случайно сгенерированное число из небольшого пула / диапазона.

public void printRandom(){
        for(int i=0; i<10; i++){
            if(firstrun){
                firstrun=false;
                num = random.nextInt(4);
                System.out.println(num);
            } else{
                num = getRandom(num);
                System.out.println(num);
            }
        }
    }

    int getRandom(int prevNum){
         ArrayList choices = new ArrayList(Arrays.asList(0, 1, 2, 3));
         choices.remove(prevNum);
         return (int) choices.get(random.nextInt(3));
    }

Ответы [ 3 ]

1 голос
/ 20 марта 2020

Попробуйте это

Random ran = new Random();
int cur, pre = ran.nextInt(4);
for (int i = 0; i < 10; i++) {
    cur = ran.nextInt(4);
    while (cur == pre) {
        cur = ran.nextInt(4);
    }
    pre = cur;
    System.out.println(cur);
}
1 голос
/ 20 марта 2020

Вам лучше получить случайное число, пока оно не будет отличаться от последнего числа, а не только один раз, другими словами, повторите это условие:

num = num==prevnum?ran.nextInt(4):num;

как:

do {
    num = num==prevnum?ran.nextInt(4):num;
while (num != prevnum);

из-за того, что у вас немного номеров, они могут совпадать, поэтому проверяйте его несколько раз, если это необходимо.

0 голосов
/ 20 марта 2020

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

Какой-то псевдокод:

// First random number.
currentNum <- random(4);
print(currentNum);

// The rest of the random numbers.  
repeat
  gap <- 1 + random(3);
  currentNum <- (currentNum + gap) MOD 4;
  print(currentNum);
until enough numbers;
...