diff --git a/config.js b/config.js index 725844d..f218ead 100644 --- a/config.js +++ b/config.js @@ -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 , 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 , 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]); diff --git a/newguy.js b/newguy.js index d3824b8..df49140 100644 --- a/newguy.js +++ b/newguy.js @@ -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(); }