zoukankan      html  css  js  c++  java
  • 《奇思妙想》在JavaScript语言中floor和round方法在某种随机分配场景下对分配区间的公平性!!!

    前言

      大欢哥的题目完成了,但是衍生出一个新的问题!上篇随笔中我和大欢哥采用的随机数生成方式,到底是谁的比较公平???

    正文

      欢迎来到阿段博客《奇思妙想》!我们的口号是 “心有多大,bug就有多大”!

      下面介绍我们的嘉宾:

        小鹏哥,小鹏哥来自xxxxxx,取得xxxxxx(一堆头衔)。前端老司机。大家鼓掌欢迎欢迎我们的小鹏哥,papapa....(小鹏哥没有大欢哥高大,但是小鹏哥有个高大的内心,从座驾便可以看出来)。

        大欢哥,大欢哥前面介绍了,现在不用介绍了(大欢哥此时心里有一句 “我去,不介绍我”,嘿嘿嘿嘿.....,开个玩笑),我们的大欢哥来自xxxxxxxx,取得xxxxxx(一堆头衔)。Java老司机。大家鼓掌欢迎欢迎我们的大欢哥,papapa....(大欢哥高大威武,但是内心柔软,老规矩还是座驾看出来的)。

      论题:如题(嘿嘿嘿....)

      论题代码:

    1 var ran1 = Math.floor(Math.random()*a.length);//方式一
    2 
    3 var ran2 = Math.round(Math.random()*(a.length-1));//方式二

      注:此处假设 JavaScript 中 Math.random() 生成的随机数在0-1之间,绝对公平。a为长度为4的数组。

      代码陈述:

        方式一:在0到1之间生成一个随机数(假设绝对公平)。用随机数乘于 a 的长度,最后取整。大欢哥代码!

        方式二:在0到1之间生成一个随机数(假设绝对公平)。用随机数乘于 a 的长度减一 ,最后四舍五入取整数。我的代码,小鹏哥代我论证。

      大欢哥:主持人,不对啊,人家的长度为 4,你为什么要减去一个啊,这样对人家数组 a 最后一个元素不公平啊!

      小鹏哥:咦,哎呀。我去。听他这么说好像,也许,或许是有那么点不公平啊....(思考中)!

      好的!两位嘉宾都觉得方式二不公平,那么两位嘉宾改论证一下方式二为什么不公平了!两位嘉宾撸袖子,拿笔拿纸中...

      .

      .

      .

      .

      (原谅我口才有限,直接说论证结果吧!)

      逻辑概念图:

      

      看图理思维:

        方式一把 a数组 抽象分为 四份!每一份的间距一样(一,二,三,四)!当 Math.random() 产生的随机数,可以均匀的落在四个区间(距离等距)每个区间的概率都为 25% ,所以,随机生成的随机数只要在Math.random函数假设公平下,方式一产生的随机数,就很公平!

        结论:

    对应区间 概率
    0 第一区间 25%
    1 第二区间 25%
    2 第三区间 25%
    3 第四区间 25%

        方式二把 a数组 抽象分为了 三份(length-1)!每一份的间距虽然也相等(三分之一:33.333333%),但是在 Math.round() 四舍五入后,要想落在第一个区间(0~0.5)的概率只有33.3333333333.........%/2=16.666666666.......%!相同的要落在第四个区间的概率也为 33.3333333333.....%/2=16.66666........%;也就是 再假设 Math.random() 绝对公平的情况下,要想获得 0 或者 3 的概率只有 16.6666666.....% ,而 1 和 2 的概率却高达 33.333333333......%

        结论:

    对应区间 概率
    0 第一区间 16.6666666666%
    1 第二区间 33.3333333333%
    2 第三区间 33.3333333333%
    3 第四区间 16.6666666666%

      感谢大欢哥和小鹏哥的精彩论证,难怪你年会没抽到奖。原来是你用错API了。。本期阿段博客《奇思妙想》到此结束。谢谢!大家下期再见......

      结论

      综合以上论证所得,在 Math.random() 绝对公平的情况下。方式一比方式二公平!!!

      对于以上结果,只相对于理论验证,没有实际数据验证,如有不同意见,欢迎指出!!!

  • 相关阅读:
    log4j2 标签解析
    7.3
    work-7.2
    爬取豆瓣上某个用户标记的想读的或者读过的图书信息
    python爬虫程序打包为exe程序并在控制台下运行
    爬取任意两个用户在豆瓣上标记的想读的图书信息的交集
    解决c# progressBar更新出现界面假死
    数据库死锁(大神请路过)
    Excel的下载和读取,部分代码(大神请路过)
    大数据缓存:redis
  • 原文地址:https://www.cnblogs.com/duanwenjian/p/7286984.html
Copyright © 2011-2022 走看看