我正在看一些代码高尔夫,并碰巧以这种方式在JavaScript中生成一个随机数:
console.log(new Date % 100);
这会生成一个0-100的随机数,但是我无法理解它……我们不只是在计算时间间隔吗?这不会是0-100的值。
答案 0 :(得分:3)
这取决于时间值的剩余部分(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>
答案 1 :(得分:2)
JavaScript日期自UNIX time起以毫秒为单位。 %
符号称为模数,在w3schools中有很好的描述。
基本上,该函数返回UNIX以来的当前毫秒数,从该数字中删除100,直到小于100,然后将其作为随机数返回。
对于伪随机数来说,这并不尽然,但是您可能会遇到浏览器“滴答声”的频率问题,这会以较小的数字分别限制其有效性。
如果您尝试将其与setTimeout or setInterval结合使用,这个问题尤其明显,因为“滴答声”之间的间隔至少要间隔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>
答案 2 :(得分:2)
我们不只是计算时间的模数吗?这不是0-100的值
实际上是;)
您是对的,我们正在计算时间的模数。在这种情况下,JS试图变得“智能”,并且在可能的情况下将两个操作数都转换为数字。 new Date()
已转换为时间戳记值,100
当然已经是一个数字。
所以如果我们有e.x. 1540808514277 % 100
的结果将介于0(如果时间戳可以除以100)和99(含)之间(如果除法的其余部分等于99)。
实际上,表达式new Date() % 100
可以转换为Date.now() % 100
,这显然更清晰。
这里的规则是数学的,可以用一句话表达:
a % b
产生一个从0到b-1的数字
答案 3 :(得分:1)
我们不只是计算时间的模数吗?
不。.我们正在对时间戳进行100模运算。不是时代时间
答案 4 :(得分:0)
我认为它将以自1970年1月1日00:00:00模数100起的毫秒数为单位。因此该值可以在0-100之间。