【发布时间】:2013-03-27 16:12:44
【问题描述】:
我见过很多生成随机数的代码
// random integers in the interval [1, 10]
Math.floor(Math.random()*10 + 1)
无论如何,我觉得我错过了一些东西。为什么人们不使用更简洁的方式
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 };...
【问题讨论】:
-
Math.ceil(Math.random()*10);生成[0,10],虽然0的概率非常非常小... -
另外,10的概率略小于1~9,因为
Math.random()从不返回1。 -
关于您的 OT 问题:并非如此。 JavaScript 没有数组初始化。 JavaScript 数组(基本上)只不过是具有数字键名和长度属性的对象。你能得到的最接近的是
new Array(size),但它不会初始化为0,而是初始化为undefined。 -
同样有趣的是,Math.ceil 比 Math.floor 慢 90%:jsperf.com/convert-to-integer
标签: javascript random