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

问题描述 投票:-1回答:1

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

笔记:

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

我一直想知道为什么它比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);

VS

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()

© www.soinside.com 2019 - 2024. All rights reserved.