Skip to content

Instantly share code, notes, and snippets.

@chjj
Created August 27, 2011 16:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chjj/1175599 to your computer and use it in GitHub Desktop.
Save chjj/1175599 to your computer and use it in GitHub Desktop.
good randomness
// small script i wrote to get strong randomness in node
// putting it here so i dont lose it
// copyright (c) 2011, christopher jeffrey, mit license, etc.
// example output:
// urandom: 0.17843490773309834
// Math.random: 0.7067500613629818
// random: 0.3154916005012327
var fs = require('fs');
var random = function(func) {
fs.open('/dev/random', 'r', function(err, fd) {
if (err) return func(err);
var buff = new Buffer(4);
fs.read(fd, buff, 0, 4, 0, function(err, bytes) {
if (err || !bytes) {
return done(err || new Error('Fail.'));
}
var num = buff[0];
num = (num << 8) | buff[1];
num = (num << 8) | buff[2];
num = (num << 8) | buff[3];
done(null, num / 0xFFFFFFFF);
});
function done(err, result) {
fs.close(fd, function() {
func(err, result);
});
}
});
};
random(function(err, num) {
if (err) throw err;
console.log('random: %d', num);
});
var urandom = function() {
var fd = fs.openSync('/dev/urandom', 'r')
, buff
, num;
try {
buff = new Buffer(4);
fs.readSync(fd, buff, 0, 4, 0);
num = buff[0];
num = (num << 8) | buff[1];
num = (num << 8) | buff[2];
num = (num << 8) | buff[3];
} catch(e) {
fs.closeSync(fd);
throw e;
}
fs.closeSync(fd);
return num / 0xFFFFFFFF;
};
console.log('urandom: %d', urandom());
// seed a deterministic RNG
// v8.googlecode.com/svn/data/benchmarks/v6/run.html
Math.random = (function() {
var seed = urandom(); //49734321;
return function() {
// Robert Jenkins' 32 bit integer hash function.
seed = ((seed + 0x7ed55d16) + (seed << 12)) & 0xffffffff;
seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff;
seed = ((seed + 0x165667b1) + (seed << 5)) & 0xffffffff;
seed = ((seed + 0xd3a2646c) ^ (seed << 9)) & 0xffffffff;
seed = ((seed + 0xfd7046c5) + (seed << 3)) & 0xffffffff;
seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff;
return (seed & 0xfffffff) / 0x10000000;
};
})();
console.log('Math.random: %d', Math.random());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment