Math.random()何时开始重复?

avo*_*avo 8 javascript random node.js

我在nodejs中进行了这个简单的测试,我让它在一夜之间运行,无法重复Math.random().我意识到价值(或甚至整个序列)迟早会重复,但对它何时会发生有什么合理的期望?

let v = {};
for (let i = 0;; i++) {
  let r = Math.random();
  if (r in v) break;
  v[r] = r;
}
console.log(i);
Run Code Online (Sandbox Code Playgroud)

dwj*_*ton 7

它是浏览器特定的:

https://www.ecma-international.org/ecma-262/6.0/#sec-math.random

20.2.2.27 Math.random()使用依赖于实现的算法或策略,返回具有正号,大于或等于0但小于1的Number值,随机或伪随机选择,在该范围内具有近似均匀的分布.此函数不带参数.

为不同的代码Realms创建的每个Math.random函数必须从连续调用生成不同的值序列.

这里的要求只是伪随机且均匀分布.

这是来自V8(Chrome和NodeJs的Javascript引擎)的博客文章.

https://v8.dev/blog/math-random

他们说他们正在使用xorshift128 +,其最大周期为2^128 -1.

  • 从来没有保证你不会连续获得两个重复的数字,重点是伪随机.如果您需要唯一性,请避免随机.如果您仍希望将随机数作为ID的一部分使用,请使用经过良好测试的模式,如UUID (4认同)
  • `2 ^ 128`听起来更有可能 (2认同)
  • 请参阅 /sf/ask/1621513211/ 使用 UUID 是清晰、明确且有据可查的碰撞机会。自行滚动将产生大量维护成本。 (2认同)