forked from AndreasMadsen/xorshift
-
Notifications
You must be signed in to change notification settings - Fork 1
/
xorshift.js
33 lines (29 loc) · 884 Bytes
/
xorshift.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
'use strict';
/**
* Basic class for XorShift generators
* @class XorShift
*/
function XorShift () {}
/**
* Returns a 64bit random number as a 2x32bit array
* @return {number[]}
*/
XorShift.prototype._random = function () {
throw new Error('Not implemented!');
};
/**
* Returns a random number normalized [0, 1), just like Math.random()
* @return {number}
*/
XorShift.prototype.random = function () {
var s = this._random();
var t1 = (s[0] & 0xf0000000) >>> 28;
var t2 = t1 * 256 + ((s[0] & 0x0ff00000) >>> 20);
var t3 = t2 * 256 + ((s[0] & 0x000ff000) >>> 12);
var t4 = t3 * 256 + ((s[0] & 0x00000ff0) >>> 4);
var t5 = t4 * 256 + (((s[0] & 0x0000000f) << 4) + ((s[1] & 0xf0000000) >>> 28));
var t6 = t5 * 256 + ((s[1] & 0x0ff00000) >>> 20);
var t7 = t6 * 256 + ((s[1] & 0x000ff000) >>> 12);
return t7 * Math.pow(2, -52);
};
module.exports = XorShift;