首頁 > web前端 > js教程 > 如何在 JavaScript 中建立可重複的隨機數序列?

如何在 JavaScript 中建立可重複的隨機數序列?

Linda Hamilton
發布: 2024-11-04 06:50:01
原創
880 人瀏覽過

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):

為了更好地控制隨機性,請考慮使用Mersenne Twister 等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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板