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