首页 > web前端 > js教程 > 如何在 JavaScript 中创建可重复的随机数序列?

如何在 JavaScript 中创建可重复的随机数序列?

Linda Hamilton
发布: 2024-11-04 06:50:01
原创
879 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板