Java Поведение Random.nextInt () - PullRequest
0 голосов
/ 08 мая 2020

Я написал этот простой код просто из любопытства и столкнулся с некоторым поведением метода nextInt () из класса Java Random, которое я не совсем понимаю. Может кто поможет разобраться?

Программа имитирует простой подбрасывание монеты. Итак, насколько я понимаю, вероятность nextInt (101) для чисел меньше и больше 49 должна быть равна.

Но пока я увеличиваю количество итераций, баланс имеет тенденцию становиться положительным, для Например, после 100000 итераций я не получил отрицательное число. Почему это происходит?

public static void main(String[] args) {
    int balance = 0;

    for (int i = 0; i < 100000; i++) {

        Random random = new Random();
        int result = random.nextInt(101);

        if (result > 49) {
            balance++;
        } else {
            balance--;
        }
    }

    System.out.println("Player's balance = " + balance);
}

Ответы [ 3 ]

6 голосов
/ 08 мая 2020

Вы вызываете int result = random.nextInt(101), который создает равномерно распределенные целые числа в [0,100], которые могут принимать 101 различное значение. Если вы отметите if (result > 49), то у вас будет 51 возможное значение ([50,100]), а в противном случае у вас будет только 50 значений ([0,49]). Таким образом, результат, скорее всего, будет в верхней части. Чтобы исправить это, вы можете сделать int result = random.nextInt(100).

1 голос
/ 08 мая 2020

вы проверяете 51 возможность положительного результата и только 50 возможностей отрицательного результата.

  • 100-50 = 51 возможность
  • 0-49 = 50 возможностей.
0 голосов
/ 08 мая 2020

Если вы пробовали, random.nextInt(99), результат будет другим, я получал минус много раз.

Причина в том, что random.nextInt() Метод. цитируется из JavaDo c.

 The algorithm is slightly tricky.  It rejects values that would result
 in an uneven distribution (due to the fact that 2^31 is not divisible
 by n). The probability of a value being rejected depends on n.  The
 worst case is n=2^30+1, for which the probability of a reject is 1/2,
 and the expected number of iterations before the loop terminates is 2.

См. Здесь Random.java # nextInt (int)

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