mirror of
https://bitbucket.org/grumdrig/pq-web.git
synced 2026-09-29 00:34:00 -06:00
Switch to a better PRNG
This commit is contained in:
@@ -1,18 +1,104 @@
|
||||
// TODO These code bits don't really belong here, but this is the only shared bit of js
|
||||
|
||||
var randseed = Math.floor(Math.random() * 0xFFFFFFFF);
|
||||
|
||||
function Random(n) {
|
||||
return Rand32Rough() % n;
|
||||
// From http://baagoe.com/en/RandomMusings/javascript/
|
||||
// Johannes Baagøe <baagoe@baagoe.com>, 2010
|
||||
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; // 2^32
|
||||
}
|
||||
return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
|
||||
};
|
||||
|
||||
mash.version = 'Mash 0.9';
|
||||
return mash;
|
||||
}
|
||||
|
||||
|
||||
function Rand32Rough() {
|
||||
// http://www.merlyn.demon.co.uk/js-randm.htm#MR
|
||||
var T32 = 0x100000000;
|
||||
var constant = 134775813;
|
||||
var X = constant * randseed + 1;
|
||||
return (randseed = X % T32);
|
||||
// From http://baagoe.com/en/RandomMusings/javascript/
|
||||
function Alea() {
|
||||
return (function(args) {
|
||||
// Johannes Baagøe <baagoe@baagoe.com>, 2010
|
||||
var s0 = 0;
|
||||
var s1 = 0;
|
||||
var s2 = 0;
|
||||
var c = 1;
|
||||
|
||||
if (args.length == 0) {
|
||||
args = [+new Date];
|
||||
}
|
||||
var mash = Mash();
|
||||
s0 = mash(' ');
|
||||
s1 = mash(' ');
|
||||
s2 = mash(' ');
|
||||
|
||||
for (var i = 0; i < args.length; i++) {
|
||||
s0 -= mash(args[i]);
|
||||
if (s0 < 0) {
|
||||
s0 += 1;
|
||||
}
|
||||
s1 -= mash(args[i]);
|
||||
if (s1 < 0) {
|
||||
s1 += 1;
|
||||
}
|
||||
s2 -= mash(args[i]);
|
||||
if (s2 < 0) {
|
||||
s2 += 1;
|
||||
}
|
||||
}
|
||||
mash = null;
|
||||
|
||||
var random = function() {
|
||||
var t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32
|
||||
s0 = s1;
|
||||
s1 = s2;
|
||||
return s2 = t - (c = t | 0);
|
||||
};
|
||||
random.uint32 = function() {
|
||||
return random() * 0x100000000; // 2^32
|
||||
};
|
||||
random.fract53 = function() {
|
||||
return random() +
|
||||
(random() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53
|
||||
};
|
||||
random.version = 'Alea 0.9';
|
||||
random.args = args;
|
||||
random.state = function (newstate) {
|
||||
if (newstate) {
|
||||
s0 = newstate[0];
|
||||
s1 = newstate[1];
|
||||
s2 = newstate[2];
|
||||
c = newstate[3];
|
||||
} else {
|
||||
return [s0,s1,s2,c];
|
||||
}
|
||||
};
|
||||
return random;
|
||||
|
||||
} (Array.prototype.slice.call(arguments)));
|
||||
};
|
||||
|
||||
|
||||
var seed = new Alea();
|
||||
|
||||
function Random(n) {
|
||||
return seed.uint32() % n;
|
||||
}
|
||||
|
||||
|
||||
function randseed(set) {
|
||||
return seed.state(set);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,12 +107,12 @@ function Pick(a) {
|
||||
}
|
||||
|
||||
|
||||
function GenerateName() {
|
||||
var KParts = [
|
||||
'br|cr|dr|fr|gr|j|kr|l|m|n|pr||||r|sh|tr|v|wh|x|y|z',
|
||||
'a|a|e|e|i|i|o|o|u|u|ae|ie|oo|ou',
|
||||
'b|ck|d|g|k|m|n|p|t|v|x|z'];
|
||||
var KParts = [
|
||||
'br|cr|dr|fr|gr|j|kr|l|m|n|pr||||r|sh|tr|v|wh|x|y|z'.split('|'),
|
||||
'a|a|e|e|i|i|o|o|u|u|ae|ie|oo|ou'.split('|'),
|
||||
'b|ck|d|g|k|m|n|p|t|v|x|z'.split('|')];
|
||||
|
||||
function GenerateName() {
|
||||
var result = '';
|
||||
for (var i = 0; i <= 5; ++i)
|
||||
result += Pick(KParts[i % 3]);
|
||||
|
||||
Reference in New Issue
Block a user