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

Javascript 这种随机数生成方法背后的逻辑是什么?,javascript,Javascript,我正在研究一些代码,并通过这种方式在JavaScript中生成一个随机数: console.log(new Date % 100); 这会产生一个随机数0-100,但我无法理解它。。。我们不是在做大纪元时间的模吗?这不是一个0-100的值。这取决于时间,它以毫秒为单位获取时间值的剩余部分(0-99),如果只使用一次,这是半随机的(如:不太可预测)。如果在紧密循环中运行,它将生成具有重复项的线性序列 演示: 功能显示(计数){ console.clear(); 对于(变量i=0;i

我正在研究一些代码,并通过这种方式在JavaScript中生成一个随机数:

console.log(new Date % 100);

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

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

演示:

功能显示(计数){
console.clear();
对于(变量i=0;i
Show 1

显示20个JavaScript日期,以微秒为单位。
%
符号称为模数,在上有详细描述

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

对于一个伪随机数来说,这并不全是坏事,但你可能会遇到浏览器“滴答”频率的问题,这分别限制了它对较小数字的用处

如果您尝试将其与“滴答声”相结合,则此问题尤其明显,其中“滴答声”将至少间隔4毫秒,这可能使您的随机数可预测

我个人建议只使用以下方法生成随机数:

/**
*返回一个介于“max”和“min”之间的随机数
*
*@param{number}[max=1]
*@param{number}[min=0]
*@返回
*/
函数getRandom(最大值、最小值){
如果(最大值===void 0){
max=1;
}
如果(最小===无效0){
最小值=0;
}
返回Math.random()*(max-min)+min;
}
//试验
var inputMin=document.getElementById(“min”);
var inputMax=document.getElementById(“max”);
var inputbtn=document.getElementById(“计算”);
inputbtn.onclick=函数(){
log(getRandom(parseFloat(inputMax.value)、parseFloat(inputMin.value));
};
Max:
最小值:

生成随机数
我认为它将完成自1970年1月1日00:00:00以来的毫秒数。因此该值可以在0-100之间

我们不是在做大纪元时间的模吗?这不是一个0-100的值

事实上,它将是;)

你们是对的,我们正在做一个大纪元时间的模数。在本例中,JS试图做到“智能”,如果可能的话,它会将两个操作数转换为一个数字
new Date()
被转换为时间戳值,
100
当然已经是一个数字了。
因此,如果我们有e.x.
1540808514277%100
,结果将介于0(如果时间戳可除以100)和99(如果除法的其余部分等于99)之间

实际上,表达式
newdate()%100
可以翻译为
Date.now()%100
,这可能更清楚

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

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

我们不是在做大纪元时间的模吗

不,我们正在对时间戳进行模100运算。不是大纪元