为 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中文网其他相关文章!