Fournir une graine personnalisée pour le générateur de nombres aléatoires JavaScript
La fonction JavaScript Math.random() par défaut génère des valeurs aléatoires dans la plage [0 , 1], mais il ne vous permet pas de définir une valeur de départ personnalisée. Par conséquent, la séquence de nombres aléatoires générée n'est pas répétable.
Pour créer un générateur de nombres aléatoires JavaScript avec une graine personnalisable, nous pouvons explorer plusieurs options :
Math.random( ) Fonctions d'assistance :
Si vous n'avez pas besoin d'un amorçage personnalisé, vous pouvez utiliser Math.random() avec des fonctions d'assistance pour créer une plage de valeurs répétable (par exemple, randRange(start, end)) .
Générateurs de nombres pseudo-aléatoires (PRNG) :
Pour plus de contrôle sur le caractère aléatoire, envisagez d'utiliser des PRNG comme le Mersenne Twister. Toutefois, sa mise en œuvre est complexe. Une alternative est un générateur congruentiel linéaire (LCG), qui est plus facile à mettre en œuvre et offre un caractère aléatoire décent.
Implémentation LCG (Short Seedable RNG) :
Vous trouverez ci-dessous un exemple d'implémentation d'un RNG court amorçable utilisant LCG :
<code class="js">function RNG(seed) { 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)]; };</code>
Pour utiliser le RNG :
<code class="js">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));</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!