1
0
Fork 0
arangodb/js/node/node_modules/ramda/ext/random/random.js

120 lines
3.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function(factory) {
if (typeof define === 'function' && define.amd) {
define(['ramda'], factory);
} else if (typeof exports === 'object') {
module.exports = factory(require('../..'));
} else {
this.Random = factory(this.ramda);
}
}(function(R) {
// Random
// ----------
//
// TODO: (possibly?)
// var random = new Random(seeds); // then...
// random.nextInt(below): () -> random int, where 0 <= int < < below
// random.intBetween(start, upTo): () -> random int, where start <= int < upTo
// random.boolean(): () -> random boolean
// random.fromChars(characters): int -> random String consisting of `int` chars drawn from `characters`.
// From http://baagoe.com/en/RandomMusings/javascript/
// mirrored at https://github.com/nquinlan/better-random-numbers-for-javascript-mirror
// Johannes Baagøe <baagoe@baagoe.com>, 2010
var Mash = function Mash() {
var n = 0xefc8249d;
var mash = function(data) {
data = data.toString();
for (var idx = 0; idx < data.length; idx++) {
n += data.charCodeAt(idx);
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;
};
// From http://baagoe.com/en/RandomMusings/javascript/
// mirrored at https://github.com/nquinlan/better-random-numbers-for-javascript-mirror
// Johannes Baagøe <baagoe@baagoe.com>, 2010
var Random = function Random() {
return (function(args) {
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 idx = 0; idx < args.length; idx++) {
s0 -= mash(args[idx]);
if (s0 < 0) {
s0 += 1;
}
s1 -= mash(args[idx]);
if (s1 < 0) {
s1 += 1;
}
s2 -= mash(args[idx]);
if (s2 < 0) {
s2 += 1;
}
}
mash = null;
var random = function() {
var t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32
s0 = s1;
s1 = s2;
s2 = t - (c = t | 0);
return s2;
};
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;
return random;
}(Array.prototype.slice.call(arguments)));
};
// Returns a shuffled version of a list, using the
// [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/FisherYates_shuffle).
R.shuffle = function(random, list) {
var idx = -1;
var len = list.length;
var position;
var result = [];
while (++idx < len) {
position = Math.floor((idx + 1) * random());
result[idx] = result[position];
result[position] = list[idx];
}
return result;
};
R.Random = Random;
return Random;
}));