Подтвердить что ты не робот

Как работает Math.random() в javascript?

Недавно я выяснил, как получить случайное число через google, и мне стало интересно, как работает Math.random(). Итак, я не могу понять, как они делали Math.random(), если они не использовали время, подобное тому, кто знает, как работает JavaScript Math.random() или эквивалент?

4b9b3361

Ответ 1

Math.random() возвращает значение Number с положительным знаком, большим или равным 0, но менее 1, выбранным случайным образом или псевдослучайно с приблизительно равномерным распределением по этому диапазону с использованием зависящего от реализации алгоритма или стратегии.

Здесь реализация V8:

uint32_t V8::Random() {

    // Random number generator using George Marsaglia MWC algorithm.
    static uint32_t hi = 0;
    static uint32_t lo = 0;

    // Initialize seed using the system random(). If one of the seeds
    // should ever become zero again, or if random() returns zero, we
    // avoid getting stuck with zero bits in hi or lo by reinitializing
    // them on demand.
    if (hi == 0) hi = random();
    if (lo == 0) lo = random();

    // Mix the bits.
    hi = 36969 * (hi & 0xFFFF) + (hi >> 16);
    lo = 18273 * (lo & 0xFFFF) + (lo >> 16);
    return (hi << 16) + (lo & 0xFFFF);
}

Источник: http://dl.packetstormsecurity.net/papers/general/Google_Chrome_3.0_Beta_Math.random_vulnerability.pdf

Вот несколько связанных потоков на StackOverflow:

Ответ 2

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

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

Простой случайный генератор (который фактически использовался в языках программирования a while back) - использовать простое число в таком алгоритме:

rnd = (rnd * 7919 + 1) & 0xffff;

Это приведет к серии чисел, которые скачутся взад и вперед, кажущиеся случайными. Например:

seed = 1337
36408
22089
7208
63833
14360
11881
41480
13689
6648

Случайный генератор в Javascript является чуть более сложным (чтобы дать еще лучшее распределение) и использует большие числа (так как он должен производить число, которое составляет около 60 бит вместо 16), но оно следует тому же основному принципу.