Switch to a better PRNG

This commit is contained in:
Eric Fredricksen
2010-06-26 23:57:33 -07:00
parent eb753b2c9d
commit f3d8c59e1e
2 changed files with 102 additions and 16 deletions
+99 -13
View File
@@ -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'];
'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]);
+2 -2
View File
@@ -22,7 +22,7 @@ var stats = {"history":[]};
function RollEm() {
var Total = $("#Total");
var ReRoll = $("#ReRoll");
stats.seed = randseed;
stats.seed = randseed();
stats.total =
Roll("STR") +
Roll("CON") +
@@ -79,7 +79,7 @@ $(document).ready(function () {
function UnrollClick() {
randseed = stats.history.pop();
randseed(stats.history.pop());
$("#Unroll").attr("disabled", !stats.history.length);
RollEm();
}