java.util. Случайная особенность - PullRequest
0 голосов
/ 28 ноября 2009

Итак, вот одна из самых простых вещей, которые можно сделать:

Random rng = new Random();
int a = rng.nextInt(10);
int b = rng.nextInt(10);

Пока все хорошо. Но мы хотим избежать равных a и b, поэтому, естественно, мы делаем:

Random rng = new Random();
int a = rng.nextInt(10);
int b = rng.nextInt(10);
while (a == b){
  b = rng.nextInt(10);
}

Однако, к моему очень, очень большому удивлению, цикл while никогда не завершается. Никогда.

Я понимаю, что теоретически со случайными числами вы могли бы иметь бесконечную последовательность из одного числа. Но этот код работает уже 10 минут, и он не вышел из цикла.

Что с этим? Я использую JDK 6 Update 16 в последней версии Linux Mint.

Ответы [ 4 ]

7 голосов
/ 28 ноября 2009
    Random rng = new Random();
    int a = rng.nextInt(10);
    int b = rng.nextInt(9);
    if (b >= a) ++b;

Проблема решена!

4 голосов
/ 28 ноября 2009

Я не знаю, почему это произошло - я попробовал это в 1.6.0_16 для Windows, и не было никаких проблем Вот полный класс:

import java.util.Random;
public class Test {
    public static void main(String[] args) {
        Random rng = new Random();
        int a = rng.nextInt(10);
        int b = rng.nextInt(10);
        while (a == b){
            System.out.println(b + " is equal to " + a + "!");
            b = rng.nextInt(10);
        }
        System.out.println(a);
        System.out.println(b);
    }
}

Иногда я получаю "а равно б!" выводить один или два раза подряд, но после этого все работает.

1 голос
/ 28 ноября 2009

Практически, это должно работать. Что-то не так с вашей средой.

Однако теоретически мы не можем предсказать, что такое случайность; Это законно, если случайный генератор дает вам одно и то же число миллион раз подряд. Чтобы иметь детерминированный код, вы можете сделать это:

int a = rng.nextInt(10);
int b = rng.nextInt( 9);
b = (a+b+1)%10;
0 голосов
/ 28 ноября 2009

Вы можете попробовать установить начальное значение на что-то другое, чтобы посмотреть, поможет ли это.

rng.setSeed (123456);

...