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

时间:2018-10-29 10:13:08

标签: javascript

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

console.log(new Date % 100);

这会生成一个0-100的随机数,但是我无法理解它……我们不只是在计算时间间隔吗?这不会是0-100的值。

5 个答案:

答案 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之间。