UNPKG

prng-parkmiller-js

Version:

Park-Miller-Carta pseudo-random number generator library

220 lines (181 loc) 6.7 kB
var util = require('util'), assert = require('assert'), PM_PRNG = require('../pm_prng'), log = util.log, inspect = util.inspect; describe('PMPRNG', function(){ it('should return the same series of numbers', function(){ var rnd = PM_PRNG.create( 16 ); var vals = []; for( var i=0;i<1000;i++ ){ vals.push( rnd.nextInt() ); } rnd = PM_PRNG.create( 16 ); // var rnd2 = PM_PRNG.create( 17 ); for( var i=0;i<1000;i++ ){ assert.equal( vals[i], rnd.nextInt() ); // assert.notEqual( vals[i], rnd2.nextInt() ); } }); it('should return an integer within a range', function(){ var rnd = PM_PRNG.create( 42 ); var val, min = Number.MAX_VALUE, max = Number.MIN_VALUE; for( var i=0;i<10000;i++ ){ val = rnd.nextIntRange( 0, 1000 ); min = Math.min( val, min ); max = Math.max( val, max ); assert( val >= 0 ); assert( val <= 1000 ); } assert.equal( min, 0 ); assert.equal( max, 1000 ); }); it('should return a double within a range', function(){ var rnd = PM_PRNG.create( 46 ); var val, min = Number.MAX_VALUE, max = Number.MIN_VALUE; for( var i=0;i<10000;i++ ){ val = rnd.nextDoubleRange( 1.3, 6.2 ); min = Math.min( val, min ); max = Math.max( val, max ); assert( val >= 1.3 ); assert( val <= 6.2 ); } assert.equal( min.toFixed(3), 1.3 ); assert.equal( max.toFixed(3), 6.2 ); }); /* from http://www.firstpr.com.au/dsp/rand31/#History-implementation Value Number of results after seed of 1 16807 1 282475249 2 1622650073 3 984943658 4 1144108930 5 470211272 6 101027544 7 1457850878 8 1458777923 9 2007237709 10 925166085 9998 1484786315 9999 1043618065 10000 1589873406 10001 2010798668 10002 1227283347 1000000 1808217256 2000000 1140279430 3000000 851767375 4000000 1885818104 5000000 168075678 99000000 1209575029 100000000 941596188 101000000 1207672015 2147483643 1475608308 2147483644 1407677000 2147483645 1 2147483646 <<< Starting the sequence again with the original seed. 16807 2147483647 */ it('should produce expected results', function(){ var rnd = PM_PRNG.create(); var i = (1 << 31) - 1; var k = 0; //iterations/second (balanced for ~2,13 ghz pentium mobile) var j = 1e+6 * 4; var start = Date.now(); while (i) { if (k >= 1 && k <= 10) { switch (k) { case 1: assert.equal( rnd.seed, 16807); break; case 2: assert.equal( rnd.seed, 282475249 ); break; case 3: assert.equal( rnd.seed, 1622650073 ); break; case 4: assert.equal( rnd.seed, 984943658 ); break; case 5: assert.equal( rnd.seed, 1144108930 ); break; case 6: assert.equal( rnd.seed, 470211272 ); break; case 7: assert.equal( rnd.seed, 101027544 ); break; case 8: assert.equal( rnd.seed, 1457850878 ); break; case 9: assert.equal( rnd.seed, 1458777923 ); break; case 10: assert.equal( rnd.seed, 2007237709 ); break; } } else if (k >= 9998 && k <= 10002) { switch (k) { case 9998: assert.equal( rnd.seed, 925166085 ); break; case 9999: assert.equal( rnd.seed, 1484786315 ); break; case 10000: assert.equal( rnd.seed, 1043618065 ); break; case 10001: assert.equal( rnd.seed, 1589873406 ); break; case 10002: assert.equal( rnd.seed, 2010798668 ); break; } } else if (k === 1000000) { assert.equal( rnd.seed, 1227283347 ); } else if (k === 2000000) { assert.equal( rnd.seed, 1808217256 ); } else if (k === 3000000) { assert.equal( rnd.seed, 1140279430 ); } else if (k === 4000000) { assert.equal( rnd.seed, 851767375 ); } else if (k === 5000000) { assert.equal( rnd.seed, 1885818104 ); } else if (k === 99000000) { assert.equal( rnd.seed, 168075678 ); } else if (k === 100000000) { assert.equal( rnd.seed, 1209575029 ); } else if (k === 101000000) { assert.equal( rnd.seed, 941596188 ); } else if (k === 2147483643) { assert.equal( rnd.seed, 1207672015 ); } else if (k === 2147483644) { assert.equal( rnd.seed, 1475608308 ); } else if (k === 2147483645) { assert.equal( rnd.seed, 1407677000 ); } else if (k === 2147483646) { assert.equal( rnd.seed, 1 ); // t.stop(); log("total time " + ( (Date.now() - startTime) / 1000 / 60 ) + " minutes."); } rnd.nextInt(); k++; i--; j--; if (j === 0) break; } log( (Date.now()-start) + "ms, iteration " + k); }); });