si vous n'avez pas besoin de semis capacité, il suffit d'utiliser Math.random()
et de construire des fonctions d'assistance autour d'elle (par exemple. randRange(start, end)
).
Je ne suis pas sûr de ce que RNG que vous utilisez, mais il est préférable de les connaître et de les documenter afin que vous êtes conscient de ses caractéristiques et des limites.
Comme Starkii dit, Mersenne Twister est un bon GÉNÉRATEUR, mais il n'est pas facile à mettre en œuvre. Si vous voulez le faire vous-même essayez de mettre en œuvre un LCG - il est très facile, s'avère aléatoire qualités (pas aussi bon que Mersenne Twister), et vous pouvez utiliser les constantes.
function RNG(seed) {
// LCG using GCC's constants
this.m = 0x80000000; // 2**31;
this.a = 1103515245;
this.c = 12345;
this.state = seed ? seed : Math.floor(Math.random() * (this.m-1));
}
RNG.prototype.nextInt = function() {
this.state = (this.a * this.state + this.c) % this.m;
return this.state;
}
RNG.prototype.nextFloat = function() {
// returns in range [0,1]
return this.nextInt() / (this.m - 1);
}
RNG.prototype.nextRange = function(start, end) {
// returns in range [start, end): including start, excluding end
// can't modulu nextInt because of weak randomness in lower bits
var rangeSize = end - start;
var randomUnder1 = this.nextInt() / this.m;
return start + Math.floor(randomUnder1 * rangeSize);
}
RNG.prototype.choice = function(array) {
return array[this.nextRange(0, array.length)];
}
var rng = new RNG(20);
for (var i = 0; i < 10; i++)
console.log(rng.nextRange(10,50));
var digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
for (var i = 0; i < 10; i++)
console.log(rng.choice(digits));