美文网首页
Math.round与Math.floor在取随机数时的区别

Math.round与Math.floor在取随机数时的区别

作者: 留白的未来 | 来源:发表于2017-11-16 16:50 被阅读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次


这是为什么呢?

相关文章

网友评论

      本文标题:Math.round与Math.floor在取随机数时的区别

      本文链接:https://www.haomeiwen.com/subject/nsalvxtx.html