Skip to content

Instantly share code, notes, and snippets.

@c7x43t
Last active July 31, 2017 21:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save c7x43t/50d10a9d5314b2148497e92a2c49d758 to your computer and use it in GitHub Desktop.
Save c7x43t/50d10a9d5314b2148497e92a2c49d758 to your computer and use it in GitHub Desktop.
// fast random number generator with better distribution
function Mash() {
var n = 0xefc8249d;
var mash = function(data) {
data = data.toString();
for (var i = 0; i < data.length; i++) {
n += data.charCodeAt(i);
var h = 0.02519603282416938 * n;
n = h >>> 0;
h -= n;
h *= n;
n = h >>> 0;
h -= n;
n += h * 0x100000000;
}
return (n >>> 0) * 2.3283064365386963e-10;
};
mash.version = 'Mash 0.9';
return mash;
}
function LFib() {
return (function(args) {
var k0 = 255,
k1 = 52,
k2 = 0;
var s = [];
var mash = Mash();
if (args.length === 0) {
args = [+new Date()];
}
for (var j = 0; j < 256; j++) {
s[j] = mash(' ');
s[j] -= mash(' ') * 4.76837158203125e-7;
if (s[j] < 0) {
s[j] += 1;
}
}
for (var i = 0; i < args.length; i++) {
for (var j = 0; j < 256; j++) {
s[j] -= mash(args[i]);
s[j] -= mash(args[i]) * 4.76837158203125e-7;
if (s[j] < 0) {
s[j] += 1;
}
}
}
mash = null;
var random = function() {
k0 = (k0 + 1) & 255;
k1 = (k1 + 1) & 255;
k2 = (k2 + 1) & 255;
var x = s[k0] - s[k1];
if (x < 0.0) {
x += 1.0;
}
x -= s[k2];
if (x < 0.0) {
x += 1.0;
}
return s[k0] = x;
};
random.uint32 = function() {
return random() * 0x100000000 >>> 0;
};
random.fract53 = random;
random.version = 'LFib 0.9';
random.args = args;
return random;
}(Array.prototype.slice.call(arguments)));
}
const random=LFib();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment