Math.round与Math.floor在取随机数时的区别
2017-11-16 本文已影响0人
留白的未来
这是个很无聊的测试
- 起因
//生成个随机数
Math.random();
//生成整数n到m
Math.round(Math.random() * (m - n) + n);
Math.floor(Math.random() * (m - n + 1) + n);
当然也可以用 Math.ceil(),
- 但我主要纠结的是 四舍五入 和 向下/上取整 在生成的随机整数的概率上的差别。
- 我觉得 四舍五入 应该比 向下/上取整 所生成的概率更平均.
- 是不是这样呢?
话不多说,开工
//分别用两种方法生成一组n到m的随机数,并放入数组
var n = 3,m = 8;
for(var i = 0, arr1 = [], arr2 = []; i < 1000000; i++) {
arr1[i] = Math.round(Math.random() * (m - n) + n);
arr2[i] = Math.floor(Math.random() * (m - n + 1) + n);
}
//封装个函数,统计n到m各整数出现的次数
function cNums(arr, n) {
for(var i = 0, j = 0; i < arr.length; i++) {
if(arr[i] == n) {j++;}
}return j;
}
//再封装一个测试函数
function csgl(arr) {
for(var i = n; i <= m; i++) {
var cs = cNums(arr, i);
document.write(i + "出现了" + cs + "次<br />");
}
}
//ok,开始测试,F5.......
document.write("Math.round<br />");
csgl(arr1);
document.write("Math.floor<br />");
csgl(arr2);
出乎我的意料,结果和我想的 完全相反:
- 刷新了十多次,
- 用向下取整所得的概率统计都非常平均的在166000左右,
- 而四舍五入所得的概率统计却起伏不定,
Math.round
3出现了100239次
4出现了199372次
5出现了200600次
6出现了199740次
7出现了200185次
8出现了99864次
Math.floor
3出现了165825次
4出现了166928次
5出现了167070次
6出现了166796次
7出现了166612次
8出现了166769次
这是为什么呢?