我见过很多代码,其中生成随机数,如
// 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:是否有更简洁的方式来声明和初始化频率?我的意思是来自C ++的frequencies[5] = { 0 };
...
答案 0 :(得分:4)
如MDN reference中关于Math.random()
返回[0,1]范围内的浮点伪随机数,从0(包括)到最大但不包括1(不包括),然后可以缩放到所需范围。 / p>
由于Math.random可以返回0
,因此Math.ceil(Math.random()*10)
也可以返回0
,且该值超出[1..10]
范围。
关于第二个问题,请参阅Most efficient way to create a zero filled JavaScript array?
答案 1 :(得分:2)
Math.floor()
是首选,因为Math.random()
。
例如,Math.random() * 10
给出的范围为[0, 10)
。使用Math.floor()
,永远不会获得10
的值,而Math.ceil()
可能会提供0
。
答案 2 :(得分:1)
区间[1,10]中的随机整数:
Math.floor(Math.random()*10 + 1)
区间[0,10]中的随机整数:
Math.ceil(Math.random()*10);
取决于你的需要。