gpt4 book ai didi

javascript - 为什么 Math.floor(Math.random() * n) 比 Date.now() % n 更好地选择 [0, n] 之间的随机数?

转载 作者:行者123 更新时间:2023-12-01 01:11:49 26 4
gpt4 key购买 nike

我一直在使用Math.floor(Math.random() * someArray.length)多年来选择数组中的随机元素。我一直想知道为什么它比Date.now() % someArray.length更好。在我看来,后者更不容易出错,而且速度一定更快(尽管我实际上还没有对它进行基准测试)。

注释:

  1. 我不需要重复性。
  2. 这不是在循环中运行,因此该函数在整个应用程序中随机调用。
  3. 这不是为了模拟,因此“或多或少”的随机性就足够了。

最佳答案

I have always wondered why it is better than Date.now() % someArray.length

日期比 Math.random 复杂得多。 -Math.random是一种专门为创建随机数而设计的方法,并且速度明显更快:

const p0 = performance.now();
const n = 3;
for (let i = 0; i < 1e6; i++) {
(Date.now() % 3)
}
const p1 = performance.now();
console.log(p1 - p0);

对比

const p0 = performance.now();
const n = 3;
for (let i = 0; i < 1e6; i++) {
Math.floor(Math.random() * 3)
}
const p1 = performance.now();
console.log(p1 - p0);

使用日期时会产生明显的开销 - 而且日期并不完全随机。例如,如果您尝试选择 1 到 1000 之间的数字,而用户碰巧尝试每 1 秒生成一个数字,则生成的数字很可能都非常接近,这可能是不可取的。 (最好不要指望用户输入时间是随机的)

如果半不错的随机性、安全性和性能对于您的项目来说不是重要目标(这在小型、随意的脚本中是可以理解的),那么您可以随意使用Date.now()相反,它不会造成太大伤害,这只是一件不寻常的事情,而且不会是可靠的随机事件。如果您想要精确、安全随机性,请使用 Crypto.getRandomValues()而不是Math.random() .

关于javascript - 为什么 Math.floor(Math.random() * n) 比 Date.now() % n 更好地选择 [0, n] 之间的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55093582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com