前言

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

正文

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

  下面介绍我们的嘉宾:

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

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

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

  论题代码:

 var ran1 = Math.floor(Math.random()*a.length);//方式一

 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() 绝对公平的情况下。方式一比方式二公平!!!

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

《奇思妙想》在JavaScript语言中floor和round方法在某种随机分配场景下对分配区间的公平性!!!的更多相关文章

  1. 关于Javascript语言中this关键字(变量)的用法

    最近很多 Javascript初学者朋友总在问: Javascript 的this 关键字的用法.我在这里索性总结一下 this关键字的用法. this 关键字是面向对象编程语言中的一个重要概念!在J ...

  2. C语言中static的使用方法【转】

    本文转自:http://blog.csdn.net/renren900207/article/details/21609649 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量 ...

  3. JavaScript里Math对象的ceil()、floor()、round()方法的区别

    ceil(x) 官方含义:对一个数进行上舍入.理解:ceiling为天花板的意思,意译为向上取整.即取得大于于等于x的最大整数. floor(x) 官方含义:对一个数进行下舍入.理解:floor为地板 ...

  4. 数学对象Math ceil()、floor()、round()方法

      Math.ceil()   功能:对一个数进行上取整. 语法:Math.ceil(x) 参数: x:一个数值. 返回值:返回大于或等于x,并且与之最接近的整数. 注:如果x是正数,则把小数“入”: ...

  5. C语言中strdup函数使用方法

    头文件:#include <string.h> 定义函数:char * strdup(const char *s); 函数说明:strdup()会先用malloc()配置与参数s 字符串相 ...

  6. C语言中的union使用方法

    union共用声明和共用一变量定义: "联合"是一种特殊的类,也是一种构造类型的数据结构.在一个"联合"内能够定义多种不同的数据类型. 一个被说明为该" ...

  7. 浅析C语言中assert的用法(转)

    原文地址:http://www.jb51.net/article/39685.htm 以下是对C语言中assert的使用方法进行了介绍,需要的朋友可以参考下. assert宏的原型定义在<ass ...

  8. 掌握R语言中的apply函数族(转)

    转自:http://blog.fens.me/r-apply/ 前言 刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么,这是 ...

  9. R语言中apply函数

    前言 刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么,这是为什么呢?原因在于R的循环操作for和while,都是基于R语言 ...

随机推荐

  1. 自定义分布式RESTful API鉴权机制

    微软利用OAuth2为RESTful API提供了完整的鉴权机制,但是可能微软保姆做的太完整了,在这个机制中指定了数据持久化的方法是用EF,而且对于用户.权限等已经进行了封装,对于系统中已经有了自己的 ...

  2. UE4 Run On owing Client解析(RPC测试)

    今天看到文档中游戏性指南->远程调用函数->在蓝图中使用远程调用函数的 Run On Owning Client 在所有权的客户端上运行部分,发现把Add Item和Remove Item ...

  3. ASP.NET Core 源码学习之 Options[2]:IOptions

    在上一篇中,介绍了一下Options的注册,而使用时只需要注入IOption即可: public ValuesController(IOptions<MyOptions> options) ...

  4. Kafka 源代码分析之Message

    这里主要分析一下message的格式. 一条message的构成由以下部分组成 val CrcOffset = 0 //crc校验部分和字长 val CrcLength = 4 val MagicOf ...

  5. 框架基础:ajax设计方案(五)--- 集成promise规范,更优雅的书写代码

    距离上一篇博客书写,又过去了大概几个月了,这段时间暂时离开了这个行业,让大脑休息一下.一个人旅行,一个人休息,正好也去完成一个目标 --- 拥有自己的驾照.当然,也把自己晒的黑漆马虎的.不过这一段时间 ...

  6. 13.如何生成订单号,用uuid

    String orderNum = UUID.randomUUID().toString().replaceAll("-", "");

  7. OSX MacVim + vim-lldb配置和使用心得

    Mac里面默认的编译器是clang/clang++ 所以debugger就选择了lldb 想搭配MacVim一起使用,于是就找到了vim-lldb这个插件,相当强大   这个插件支持Vundle,所以 ...

  8. PostgreSQL 使用 PreparedStatement 导致查询慢的分析

    实验环境: DB is PostgreSQL version 8.2.15 JDK1.8 测试一 使用JDBC查询一个SQL: public static void test1(String url, ...

  9. net 中web.config单一解决方法 (其他配置引入方式)

    近期一个项目需要写许多的配置项,发现在单个web.config里面写的话会很乱也难于查找 所以搜了一下解决了,记录下来 一.   webconfig提供了引入其他config的方式 <conne ...

  10. Spring Boot简单xml配置集成mybatis

    一.xml配置版 1.properties文件中增加的配置: mybatis.config-locations=classpath:mybatis/mybatis-config.xml mybatis ...