Пишем генератор випадкових чисел

Публікації

Генератор випадкових чисел за допомогою програмування часто називають псевдогенераторами випадкових чисел.

Псевдогенератор — видає число отримане за певним алгоритмом числової послідовності, властивості якого наближаються до випадкового.

Для генерації випадкового числа у JavaScript є метод Math.random().

Розглянемо створення генератора випадкових чисел без Math.random().

Програмний генератор випадкових чисел вираховується за різними формулами і використовують початкове число для генерації випадкових чисел.

Якщо пачаткове число є сталим тоді результати будуть однаковими.

Щоб зробити початкове число випадковим можна використати: Date.getTime(), Date.getMilliseconds(), performance.now() і т.д.

Я написав функцію RIPrandom яка генерує число від 0 до 1.
var next=0.98765; //початкове число генерації function RIPrandom(){ next=next*2.5; if(next>4)next=next/4; return next/4; } //приклад використання var el=document.getElementById('result'); el.value=''; for(i=0;i<100;i++) el.value+=RIPrandom()+'\n';

Так як початкове число генерації є сталим то і результати генерації будуть однакові.

Присвоюємо початковову числу next випадкове значення. Будемо брати з мілісекунд поточного часу за допомогою Date.getMilliseconds(). Рядок буде мати наступний формат: "0.[0..999]98765". Рядок перетворюємо у число.

var next=Number('0.'+((new Date()).getMilliseconds())+'98765'); function RIPrandom(){ next=next*2.5; if(next>4)next=next/4; return next/4; } //приклад використання var el=document.getElementById('result2'); el.value=''; for(i=0;i<100;i++) el.value+=RIPrandom()+'\n';

Лінійний конгруентний метод

Лінійний конгруентний метод генерації псевдовипадкових чисел полягає в обчисленні послідовності випадкових чисел Xn :
X1 = (a * X0 + c) mod m;
X2 = (a * X1 + c) mod m;
X3 = (a * X2 + c) mod m;

Метод має наступні змінні: X - попереднє випадкове число, m - модуль, a - коефіцієнт, c - константа.

var m = 100, X = 17, //вказуємо початкове число a=70, c=12; function getRand(){ X = (a * X + c) % m; return X; } alert( getRand() ); alert( getRand() );

Mulberry32 PRNG

Mulberry32 це 32-розрядний варіант 63-розрядного Thrust PRNG.

Функція mulberry32 приймає параметр x - будь яке число.

function mulberry32(x){ var z = (x += 0x6D2B79F5); z = (z ^ (z >> 15)) * (z | 1); z ^= z + (z ^ (z >> 7)) * (z | 61); return z ^ (z >> 14); } alert( mulberry32( 2 ) );

Також є варіант який повертає випадкове число від 0 до 1.

function mulberry32(x){ var t = x += 0x6D2B79F5; t = Math.imul(t ^ t >>> 15, t | 1); t ^= t + Math.imul(t ^ t >>> 7, t | 61); return ((t ^ t >>> 14) >>> 0) / 4294967296; } alert( mulberry32( 2 ) );

Xorshift

Xorshift генератор псевдовипадкових чисел.

function xorshift32(a) { var x = a; x ^= x << 13; x ^= x >> 17; x ^= x << 5; return x; } function xorshift64(a) { var x = a; x ^= x << 13; x ^= x >> 7; x ^= x << 17; return x; } function xorshift128(a,b,c,d) { var t = d; const s = a; d = c; c = b; b = s; t ^= t << 11; t ^= t >> 8; return a = t ^ s ^ (s >> 19); } function xorshift128ss(a, b, c, d) { var t = b << 9, r = a * 5; r = (r << 7 | r >>> 25) * 9; c ^= a; d ^= b; b ^= c; a ^= d; c ^= t; d = d << 11 | d >>> 21; return (r >>> 0) / 4294967296; } alert( xorshift32(1) ); alert( xorshift64(1) ); alert( xorshift128(1,2,4,4) ); alert( xorshift128ss(1,2,4,4) );

SmallPRNG

Генератор випадкових чисел SmallPRNG приймає параметр s - початкове число.

function SmallPRNG(s){ function rot(x, k){return (x << k) | (x >> (32 - k));} var a=0xf1ea5eed, b=s, c=s, d=s; var e = (a - rot(b, 27)) >>> 0; a = (b ^ rot(c, 17)) >>> 0; b = (c + d) >>> 0; c = (d + e) >>> 0; d = (e + a) >>> 0; return d/ 4294967296.0; } alert( SmallPRNG( 1 ) );
2020-09-08 13:52:06

Тільки зареєстровані користувачі можуть писати коментарі.