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?

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

Рекомендации

Другие вопросы по тегам