《奇思妙想》在JavaScript语言中floor和round方法在某种随机分配场景下对分配区间的公平性!!!
前言
大欢哥的题目完成了,但是衍生出一个新的问题!上篇随笔中我和大欢哥采用的随机数生成方式,到底是谁的比较公平???
正文
欢迎来到阿段博客《奇思妙想》!我们的口号是 “心有多大,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方法在某种随机分配场景下对分配区间的公平性!!!的更多相关文章
- 关于Javascript语言中this关键字(变量)的用法
最近很多 Javascript初学者朋友总在问: Javascript 的this 关键字的用法.我在这里索性总结一下 this关键字的用法. this 关键字是面向对象编程语言中的一个重要概念!在J ...
- C语言中static的使用方法【转】
本文转自:http://blog.csdn.net/renren900207/article/details/21609649 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量 ...
- JavaScript里Math对象的ceil()、floor()、round()方法的区别
ceil(x) 官方含义:对一个数进行上舍入.理解:ceiling为天花板的意思,意译为向上取整.即取得大于于等于x的最大整数. floor(x) 官方含义:对一个数进行下舍入.理解:floor为地板 ...
- 数学对象Math ceil()、floor()、round()方法
Math.ceil() 功能:对一个数进行上取整. 语法:Math.ceil(x) 参数: x:一个数值. 返回值:返回大于或等于x,并且与之最接近的整数. 注:如果x是正数,则把小数“入”: ...
- C语言中strdup函数使用方法
头文件:#include <string.h> 定义函数:char * strdup(const char *s); 函数说明:strdup()会先用malloc()配置与参数s 字符串相 ...
- C语言中的union使用方法
union共用声明和共用一变量定义: "联合"是一种特殊的类,也是一种构造类型的数据结构.在一个"联合"内能够定义多种不同的数据类型. 一个被说明为该" ...
- 浅析C语言中assert的用法(转)
原文地址:http://www.jb51.net/article/39685.htm 以下是对C语言中assert的使用方法进行了介绍,需要的朋友可以参考下. assert宏的原型定义在<ass ...
- 掌握R语言中的apply函数族(转)
转自:http://blog.fens.me/r-apply/ 前言 刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么,这是 ...
- R语言中apply函数
前言 刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么,这是为什么呢?原因在于R的循环操作for和while,都是基于R语言 ...
随机推荐
- webpack3新特性介绍
6月20号webpack推出了3.0版本,官方也发布了公告.根据公告介绍,webpack团队将未来版本的改动聚焦在社区提出的功能需求,同时将保持一个快速.稳定的发布节奏.本文主要依据公告内容,简单介绍 ...
- 【转载】Static 关键字的作用
原始日期:2016-07-16 17:53 一 普通的static关键字 1. 静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量.我们先举一个静态全局变 ...
- php设计模式--命名空间与自动载入
关于命名空间: 最早的php是没有命名空间的概念的,这样不能存在相同名称的类或者函数,当项目变大了之后,产生冲突的可能性就高了,代码量也会变大,为了规划,从php5.3开始对命名空间就支持了. 说明代 ...
- 响应式、手机端、自适应 百分比实现div等宽等高的方法
在百分比布局中, 有时候会遇见一个头疼的问题,就是如果某个布局是正方形的话,我们在这种情况下考虑到适应各种媒体尺寸,又不能给它定固定的宽高. 之前遇见过纯色布局的结果我就用纯色图片代替实现的,现在有了 ...
- GNU的makefile文件编写说明
这篇文章讲的相当详细,转来收藏: linux下Makefile学习 MAC
- Easyui设置动态表格,动态导出数据实例,附Demo
最近开发的过程中碰到一个客户提出的需求,一个指定的页面导出需要提供一个弹出页面选择列表页面需要显示的列,页面确认之后需要修改列表页面显示的表格,导出的数据也需要同步变化. 总结一下可以称为一个列表数据 ...
- 我的第一篇博文:C++最初的路-经典的小游戏走迷宫
写在开始:这个博客建于大二下学期.2年多的学习,从网上借鉴的大牛经验,代码,指导数不胜数,而其中大部分来自别人的博客,于是期待有一天也能把自己在学习过程中的一些经验拿出来与大家分享. 其实我凝望了C+ ...
- 超好用的memcache管理及可视化监控工具,真方便!
memcache做为主流的缓存数据库之一,广泛在各互联网平台使用,但是大家使用中都知道memcache目前没有一个比较好用的可视化客户端工具,每次都要输入命令进行操作,十分不方便. 而另一款主流缓存 ...
- spring整合axis2(最小配置化)的示例
参考文档: http://blog.csdn.net/xinhaoluan/article/details/3605234 环境配置: spring-framework-3.2.7 axis2-1.6 ...
- 谈谈关于PHP的代码安全相关的一些致命知识
谈谈关于PHP的代码安全相关的一些致命知识 目标 本教程讲解如何防御最常见的安全威胁:SQL 注入.操纵 GET 和 POST 变量.缓冲区溢出攻击.跨站点脚本攻击.浏览器内的数据操纵和远程表单提交. ...