JavaScript随机数的组合问题案例分析


Posted in Javascript onMay 16, 2020

本文实例讲述了JavaScript随机数的组合问题。分享给大家供大家参考,具体如下:

随机数的组合问题在面试时是经常考的,比如之前我就被问到:“有一个可以生成1-5的随机数函数,怎样把它扩大到1-7?”

在解决这个问题之前,先来看看另外一个比较简单的问题:“有一个可以生成1-7的函数,怎样把它缩小到1-5?”下面是一个生成1-7函数random7:

function random7() {
return Math.floor(Math.random() * 7 + 1);
}

如何把它转成生成1-5的函数呢?这很简单:在一个循环里面调用random7,直到它的值小于等于5就结束循环并返回该随机数即可,如下:

function random5() {
var r = random7();

while(r > 5) {


r = random7();

}

return r;
}

上面的思路就是:如果生成的随机数大于5,就继续调用random7,直到它小于等于5为止。好吧,回归正题,再来看一下1-5如何转成1-7吧。下面是一个随机生成1-5的函数:

function random5() {
return Math.floor(Math.random() * 5 + 1);
}

我们现在的目的是要把它扩大到1-7。有一种很自然的想法可能就是:一个random5()产生的随机数范围是1-5,那么两个random5()相加的范围就是2-10了,再减去1就是1-9了,所以,可以按照上面的思路,在random7里来个循环,如果小于等于7就结束循环并且返回。如下:

function random7() {
var r = random5() + random5() - 1;

while(r > 7) {


r = random5() + random5() - 1;

}

return r;
}

这样确实可以把1-5的范围扩大到1-7,但是问题来了:所谓随机函数,产生的每个值的概率是相等的,但是上面的方法产生的值概率相等吗?我们可以使用概率论的组合知识算?缋矗荷?桑庇幸恢肿楹希?褪?andom5() + random5() - 1;中的两个random5()均是1,生成2有两种组合,第一个random5()是1第二个是2,或者相反。显然,它们的概率是不等的。所以这种方法是不行的。

为了实现生成的每个值的概率是相等的,就是使得每个值的组合数相等。一种可行的方法是使得每个值的组合只有一种,如下:

function random7() {
var r = (random5() - 1) * 5 + random5(); 

while(r > 7) {


r = (random5() - 1) * 5 + random5(); 

}

return r;
}

为什么这样就会使得各个值的概率相等呢?首先来看一下(random5() - 1) * 5,容易算?缯飧霰泶锸缴?傻目裳≈凳牵埃?担?0,15,20,用它去跟random5()相加,因为random5()的可选值是1, 2,3,4,5,所以两者相加之后就会得到1-25之间的随机数,而且产生的每个值的组合均只有一种,所以它们的概率也是相等的。

也许有人会问,(random5() - 1) * 5,这里为什么是乘以5而不是其他呢?这是因为乘以5之后和random5()相加,得到的数是连续的并且是等概率的。

上面讨论的都是特殊情形1-5和1-7之间的转换,对于其他的一般情形,大家可以自己试试哈。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
js原生态函数中使用jQuery中的 $(this)无效的解决方法
May 25 Javascript
jQuery验证Checkbox是否选中的代码 推荐
Sep 04 Javascript
jquery网页回到顶部效果(图标渐隐,自写)
Jun 16 Javascript
详解JavaScript中循环控制语句的用法
Jun 03 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
Jan 26 Javascript
JS字符串false转boolean的方法(推荐)
Mar 08 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
May 28 Javascript
基于es6三点运算符的使用方法(实例讲解)
Oct 12 Javascript
vue环形进度条组件实例应用
Oct 10 Javascript
解决vue admin element noCache设置无效的问题
Nov 12 Javascript
vue页面更新patch的实现示例
Mar 25 Javascript
利用React高阶组件实现一个面包屑导航的示例
Aug 23 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
May 18 #Javascript
vue el-tree 默认展开第一个节点的实现代码
May 15 #Javascript
基于leaflet.js实现修改地图主题样式的流程分析
May 15 #Javascript
uni-app从安装到卸载的入门教程
May 15 #Javascript
Vue数据双向绑定原理实例解析
May 15 #Javascript
JavaScript鼠标悬停事件用法解析
May 15 #Javascript
JavaScript enum枚举类型定义及使用方法
May 15 #Javascript
You might like
mysq GBKl乱码
2006/11/28 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
推荐一本PHP程序猿都应该拜读的书
2014/12/31 PHP
PHP多文件上传类实例
2015/03/07 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
js中的for如何实现foreach中的遍历
2014/05/31 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
js表单提交和submit提交的区别实例分析
2015/12/10 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
基于js实现二级下拉联动
2016/12/17 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
通过vue刷新左侧菜单栏操作
2020/08/06 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
JavaScript实现滚动加载更多
2020/12/27 Javascript
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
Python 字符串操作方法大全
2014/03/11 Python
Python中多线程thread与threading的实现方法
2014/08/18 Python
详解python中的hashlib模块的使用
2019/04/22 Python
基于python实现高速视频传输程序
2019/05/05 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
基于python实现计算且附带进度条代码实例
2020/03/31 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
岗位竞聘演讲稿范文
2014/04/24 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
聚众斗殴罪辩护词
2015/05/21 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书