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
Libérer: 2024-11-04 06:50:01
original
880 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal