[英]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.