為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中文網其他相關文章!