繁体   English   中英

这种随机数生成方法背后的逻辑是什么?

[英]What is the logic behind this method of random number generation?

我正在看一些代码高尔夫,并遇到这种方式在JavaScript中生成一个随机数:

console.log(new Date % 100);

这会产生一个0-100的随机数,但我无法理解它...我们不只是做一个纪元时间的模数吗? 这不是0-100的值。

它取决于,它采用时间值的余数(0-99),以毫秒为单位,如果仅使用一次,则为半随机(如:不可预测)。 如果在紧密循环中运行,它将生成具有重复的线性序列。

演示:

 function show(count) { console.clear(); for (var i = 0; i < count; i++) console.log(new Date % 100); } 
 <button onclick="show(1)">Show 1</button> <button onclick="show(20)">Show 20</button> 

JavaScript日期自UNIX时起以微秒为单位工作。 %符号称为模数,在w3schools上有很好的描述。

基本上,该函数返回自UNIX以来的当前毫秒数,从该数字中删除100,直到低于100,并将其作为随机数返回。

对于一个伪随机数而言,它并不是一件坏事,但是你可能会遇到浏览器“滴答”频率的问题,它会用较小的数字限制其有用性。

如果你试图将它与setTimeout或setInterval结合起来,这个问题尤为明显,其中“ticks”将相隔至少4毫秒,可能使你的随机数可预测。

我个人建议只使用Math.random()来生成随机数:

 /** * Returns a random number between "max" and "min" * * @param {number} [max=1] * @param {number} [min=0] * @returns */ function getRandom(max, min) { if (max === void 0) { max = 1; } if (min === void 0) { min = 0; } return Math.random() * (max - min) + min; } //TEST var inputMin = document.getElementById("min"); var inputMax = document.getElementById("max"); var inputbtn = document.getElementById("calculate"); inputbtn.onclick = function() { console.log(getRandom(parseFloat(inputMax.value), parseFloat(inputMin.value))); }; 
 Max: <input type="number" id="max" min="1" value="100" /><br/> Min: <input type="number" id="min" min="0" value="1" /><br/> <button id="calculate">Generate Random</button> 

我们不只是做一个时代的模数吗? 这不是0-100的值

实际上,它将是;)

你是对的,我们正在做一个时代的模数。 在这种情况下,JS正在尝试“智能”,如果可能,它会将两个操作数转换为数字。 new Date()被转换为timestamp值, 100当然是一个数字。
因此,如果我们有ex 1540808514277 % 100则结果将介于0之间(如果时间戳可以被100分割)和99之间(如果除法中的其余部分等于99)。

实际上,表达式new Date() % 100可以转换为Date.now() % 100 ,这可能更清楚。

这里的规则是数学的,可以用一句话来表达:

a % b产生从0到b-1的数字

我们不只是做一个时代的模数吗?

没有..我们正在模数100上进入时间戳。 不是纪元时光

我认为它会做自1970年1月1日00:00:00模数100以来的毫秒数。因此该值可以在0-100之间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM