Math.random и другие случайные алгоритмы
Я использую клиентское приложение node.js для удаленного сервера.
Я могу ~100% времени сбой удаленного сервера при использовании Math.random в клиенте node.js. Однако с тех пор я попробовал пару детерминированных генераторов случайных чисел, и ни один из них не смог его сломать.
Я подозреваю, что это связано с идиосинкразией Math.random или проверенных генераторов, которые я тестировал.
Это один из сеяных генераторов, которые я пробовал:
var x = 123456789, y = 362436069, z = 521288629, w = 88675123;
function random() { // See http://stackru.com/a/6275875
var t;
t = x ^ (x << 11);
x = y; y = z; z = w;
return (w = w ^ (w >> 19) ^ (t ^ (t >> 8)))/(4294967296/2);
}
Каким образом выходные данные будут отличаться от Math.random()? Кроме того, почему 2^32, 4294967296, нужно разделить на 2?
1 ответ
Каким образом выходные данные будут отличаться от Math.random ()?
Math.random использует неявный алгоритм, специфичный для движка, который не имеет возможности заполнения, в то время как ваша реализация не зависит от платформы и явно загружена.
Кроме того, почему 2^32, 4294967296, нужно разделить на 2?
Он используется для обеспечения кратности двух, поэтому генератор случайных чисел не выходит из строя на нечетном числе.
Рекомендации