Під час дослідження генерації випадкових чисел за допомогою квантового програмування я задумався як саме працює Math.random() в JS.
Декілька моментів які хочеться виділити:
- Math.random() - це частина браузерного апі, не частина мови
- У всіх браузерах після 2015 року для Math.random() використовується алгоритм генерації псевдовипадкових чисел xorshift128+
- xorshift128+ - використовує сід фразу для встановлення початкових значень state0 та state1. Код можна алгоритму можна побачити нижче:
uint32_t state0 = 1;
uint32_t state1 = 2;
uint32_t mwc1616() {
state0 = 18030 * (state0 & 0xFFFF) + (state0 >> 16);
state1 = 30903 * (state1 & 0xFFFF) + (state1 >> 16);
return state0 << 16 + (state1 & 0xFFFF);
}
- Для Node.js сід фразу можна вказати при запуску за допомогою параметра —random_seed, відповідно якщо запустити ноду з цим параметром і згенерувати число два рази, то результат буде однаковим. Код викликів нижче:
$ node --random_seed=42
Welcome to Node.js v16.0.0-pre.
Type ".help" for more information.
> Math.random()
0.7939112874678715
> for (let i = 0; i < 1000; i++) Math.random();
0.6681221903420669
> Math.random()
0.009229884165582902
>
$ node --random_seed=42
Welcome to Node.js v16.0.0-pre.
Type ".help" for more information.
> Math.random()
0.7939112874678715
> for (let i = 0; i < 1000; i++) Math.random();
0.6681221903420669
> Math.random()
0.009229884165582902
Декілька посилань:
Стаття: https://apechkurov.medium.com/v8-deep-dives-random-thoughts-on-math-random-fb155075e9e5 Пост у блозі V8: https://v8.dev/blog/math-random
Якщо вам цікаво почитати про генерацію випадкових чисел через квантове програмування — напишіть у коментарях.