Каковы шансы, что JavaScript Math.Random () создаст одно и то же число дважды подряд? - PullRequest
7 голосов
/ 16 декабря 2010

Это правильно?использование - http://en.wikipedia.org/wiki/Binomial_probability

Похоже, значения находятся в диапазоне от .0000000000000000 до .9999999999999999

Вероятность повторения = p ^ 2 = (1/9999999999999999) ^ 2 = 1,0 e-32

Я думаю, что я что-то здесь упускаю?

Кроме того, как генератор псевдослучайных чисел может изменить этот расчет?

Спасибо.

Ответы [ 5 ]

5 голосов
/ 16 декабря 2010

Я думаю, что вероятность получения двух чисел подряд равна 1, деленному на диапазон генератора, при условии, что он имеет хорошее распределение.

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

Получение определенного числа дважды в строке, например, два 0,5 подряд, будет р ^ 2; однако, если вы просто заботитесь о любом числе два раза подряд, это просто р.

5 голосов
/ 16 декабря 2010

В идеальном мире Math.random () был бы абсолютно случайным, с одним выходом, полностью независимым от другого, что (предполагая, что p = вероятность появления любого данного числа) приводит к вероятности p ^ 2 для любогозначение повторяется сразу за другим (как уже говорили другие).

На практике люди хотят, чтобы Math.random был быстрым, что означает, что движки используют генераторы псевдослучайных чисел.Существует много различных типов PRNG, но самым основным является линейный конгруэнтный генератор, который в основном представляет собой функцию в следующем виде:

s(n + 1) = some_prime * s(n) + some_value mod some_other_prime

Если такой генератор используется, вы не увидите значениеповторяется, пока вы не позвоните random() some_other_prime раз.Это вам гарантировано.

Относительно недавно, однако стало очевидно, что этот тип поведения (в сочетании с заполнением PRNG с текущим временем) может использоваться для отслеживания некоторых форм, что привело к тому, что браузеры выполняют ряд операций.вещи, которые означают, что вы не можете предполагать что-либо о последующих random() вызовах.

2 голосов
/ 17 декабря 2010

Вероятность того, что вы получите 2 при данных числах, равна (1 / p) ^ 2, но вероятность того, что вы получите 2 одинаковых числа (любых), равна 1 / p. Это потому, что первое число может быть чем угодно, а второе просто должно соответствовать этому.

2 голосов
/ 16 декабря 2010

Если бы числа были действительно случайными, вы ожидали бы, что они действительно появятся с вероятностью 1 / p, так что в два раза это будет 1 / p ^ 2.

Значение для p не совсем точнохотя у вас есть, потому что числа представляются внутри как двоичные.Выясните, сколько битов мантиссы имеют числа в javascript, и используйте это для своего комбинаторного счета.

Часть «псевдослучайного» более интересна, поскольку свойства генераторов псевдослучайных чисел различны.Кнут проделывает прекрасную работу с этим в Получисловых Алгоритмах , но в основном большинство обычных генераторов PN имеют по крайней мере некоторое спектральное распределение.Cryptograp0hic PN генераторы, как правило, сильнее.

Обновление : количество времени не должно быть значительным.Будь то миллисекунда или год, если вы не обновляете состояние. Вероятности останутся прежними.

0 голосов
/ 27 марта 2017

Вы можете как-то узнать, просто дайте ему поработать несколько дней:)

var last = 0.1;
var count = 0 | 0;
function rand(){
    ++count;
    var num = Math.random();
    if(num === last){
        console.log('count: '+count+' num: '+num);
    }
    last = num;
} 
while(true) rand();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...