JavaScript で反復可能な乱数シーケンスを作成するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-04 06:50:01
オリジナル
854 人が閲覧しました

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

JavaScript 乱数ジェネレーターのカスタム シードの提供

デフォルトの JavaScript Math.random() 関数は、[0] の範囲内のランダムな値を生成します。 , 1] ですが、カスタム シードを設定することはできません。したがって、生成された乱数のシーケンスは反復不可能です。

カスタマイズ可能なシードを使用して JavaScript 乱数ジェネレーターを作成するには、複数のオプションを検討できます。

Math.random( ) ヘルパー関数:

カスタム シードが必要ない場合は、ヘルパー関数で Math.random() を利用して、反復可能な値の範囲 (例: randRange(start, end)) を作成できます。 .

擬似乱数ジェネレーター (PRNG):

ランダム性をさらに制御するには、メルセンヌ ツイスターのような PRNG の使用を検討してください。ただし、その実装は複雑です。代替手段は線形合同ジェネレータ (LCG) です。これは実装が簡単で、適切なランダム性を提供します。

LCG 実装 (ショート シード可能 RNG):

以下はLCG を使用した短いシード可能 RNG の実装例:

<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>
ログイン後にコピー

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>
ログイン後にコピー

以上がJavaScript で反復可能な乱数シーケンスを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート