Maison >interface Web >js tutoriel >Comment puis-je créer une séquence répétable de nombres aléatoires en JavaScript ?

Comment puis-je créer une séquence répétable de nombres aléatoires en JavaScript ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-04 06:50:01912parcourir

How can I create a repeatable sequence of random numbers in JavaScript?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn