Генератор випадкових чисел за допомогою програмування часто називають псевдогенераторами випадкових чисел.
Псевдогенератор — видає число отримане за певним алгоритмом числової послідовності, властивості якого наближаються до випадкового.
Для генерації випадкового числа у JavaScript є метод Math.random().
Розглянемо створення генератора випадкових чисел без Math.random().
Програмний генератор випадкових чисел вираховується за різними формулами і використовують початкове число для генерації випадкових чисел.
Якщо пачаткове число є сталим тоді результати будуть однаковими.
Щоб зробити початкове число випадковим можна використати: Date.getTime(), Date.getMilliseconds(), performance.now() і т.д.
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 :Метод має наступні змінні: 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 ) );