Skip to content

Instantly share code, notes, and snippets.

@opparco
Created October 3, 2020 09:58
Show Gist options
  • Save opparco/2d2e1bf1448ed6845b293adcf719b05a to your computer and use it in GitHub Desktop.
Save opparco/2d2e1bf1448ed6845b293adcf719b05a to your computer and use it in GitHub Desktop.
random test
// https://github.com/opal/opal/blob/b1074a37150f9b0b53a35f0efa4a1cbddc02ba29/opal/corelib/random/mersenne_twister.rb
// node opal_mt.js
var mt19937 = (function() {
/* Period parameters */
var N = 624;
var M = 397;
var MATRIX_A = 0x9908b0df; /* constant vector a */
var UMASK = 0x80000000; /* most significant w-r bits */
var LMASK = 0x7fffffff; /* least significant r bits */
var MIXBITS = function(u,v) { return ( ((u) & UMASK) | ((v) & LMASK) ); };
var TWIST = function(u,v) { return (MIXBITS((u),(v)) >>> 1) ^ ((v & 0x1) ? MATRIX_A : 0x0); };
function init(s) {
var mt = {left: 0, next: N, state: new Array(N)};
init_genrand(mt, s);
return mt;
}
/* initializes mt[N] with a seed */
function init_genrand(mt, s) {
var j, i;
mt.state[0] = s >>> 0;
for (j=1; j<N; j++) {
//mt.state[j] = (1812433253 * ((mt.state[j-1] ^ (mt.state[j-1] >> 30) >>> 0)) + j);
var s = mt.state[j-1] ^ (mt.state[j-1] >>> 30);
mt.state[j] = (((((s & 0xffff0000) >>> 16) * 1812433253) << 16) + (s & 0x0000ffff) * 1812433253) + j;
/* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
/* In the previous versions, MSBs of the seed affect */
/* only MSBs of the array state[]. */
/* 2002/01/09 modified by Makoto Matsumoto */
mt.state[j] &= 0xffffffff; /* for >32 bit machines */
}
mt.left = 1;
mt.next = N;
}
/* generate N words at one time */
function next_state(mt) {
var p = 0, _p = mt.state;
var j;
mt.left = N;
mt.next = 0;
for (j=N-M+1; --j; p++)
_p[p] = _p[p+(M)] ^ TWIST(_p[p+(0)], _p[p+(1)]);
for (j=M; --j; p++)
_p[p] = _p[p+(M-N)] ^ TWIST(_p[p+(0)], _p[p+(1)]);
_p[p] = _p[p+(M-N)] ^ TWIST(_p[p+(0)], _p[0]);
}
/* generates a random number on [0,0xffffffff]-interval */
function genrand_int32(mt) {
/* mt must be initialized */
var y;
if (--mt.left <= 0) next_state(mt);
y = mt.state[mt.next++];
/* Tempering */
y ^= (y >>> 11);
y ^= (y << 7) & 0x9d2c5680;
y ^= (y << 15) & 0xefc60000;
y ^= (y >>> 18);
return y >>> 0;
}
function int_pair_to_real_exclusive(a, b) {
a >>>= 5;
b >>>= 6;
return(a*67108864.0+b)*(1.0/9007199254740992.0);
}
// generates a random number on [0,1) with 53-bit resolution
function genrand_real(mt) {
/* mt must be initialized */
var a = genrand_int32(mt), b = genrand_int32(mt);
return int_pair_to_real_exclusive(a, b);
}
return { genrand_real: genrand_real, init: init, genrand_int32: genrand_int32 };
})()
{
const seed = 1000; //Math.round(Math.random() * MAX_INT);
var mt = mt19937.init(seed)
console.log(mt19937.genrand_real(mt))
console.log(mt19937.genrand_real(mt))
console.log(mt19937.genrand_real(mt))
}
node opal_mt-1.js
0.6535895854646095
0.11500694312440574
0.9502828643490245
ruby ruby-random.rb
0.6535895854646095
0.11500694312440574
0.9502828643490245
mt = Random.new(1000)
p mt.rand
p mt.rand
p mt.rand
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment