繁体   English   中英

随机数,Math.floor(...)vs Math.ceil(...)

[英]Random Number, Math.floor(…) vs Math.ceil(…)

我已经看到了很多生成随机数的代码

// random integers in the interval [1, 10]
Math.floor(Math.random()*10 + 1)

无论如何,我觉得我错过了什么。 人们为什么不使用更多的succint方式

Math.ceil(Math.random()*10);

我试图测试随机性,到目前为止似乎是真的。

实际上,后续的代码

// will generate random integers from 1 to 4
var frequencies = [ 0, 0, 0, 0, 0 ]; // not using the first place
var randomNumber;
for ( var i = 0; i < 1*1000*1000; ++i ) {
   randomNumber = Math.ceil(Math.random()*4);
   frequencies[randomNumber]++;
}

for ( var i = 1; i <= 4; ++i ) {
   console.log(i +": "+ frequencies[i]);
}

打印出来

1: 250103
2: 250161
3: 250163
4: 249573

我错过了什么?

快速OT:是否有更简洁的方式来声明和初始化频率? 我的意思是frequencies[5] = { 0 }; 来自C ++ ......

如关于Math.random() MDN参考文献中所述

返回[0,1]范围内的浮点伪随机数,从0(包括)到最大但不包括1(不包括),然后可以缩放到所需范围。

由于Math.random可以返回0 ,因此Math.ceil(Math.random()*10)也可以返回0并且该值超出[1..10]范围。


关于第二个问题,请参阅创建零填充JavaScript数组的最有效方法?

Math.floor()在这里是首选,因为Math.random()的范围。

例如, Math.random() * 10给出[0, 10) Math.random() * 10的范围。 使用Math.floor()永远不会得到10的值,而Math.ceil() 可能得到0

区间[1,10]中的随机整数:

Math.floor(Math.random()*10 + 1)

区间[0,10]中的随机整数:

Math.ceil(Math.random()*10);

只是取决于你需要什么。

暂无
暂无

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

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