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 相关文章推荐
javaScript parseInt字符转化为数字函数使用小结
Nov 05 Javascript
jquery 如何动态添加、删除class样式方法介绍
Nov 07 Javascript
javascript 使td内容不换行不撑开
Nov 29 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
May 06 Javascript
jquery批量控制form禁用的代码
Aug 06 Javascript
JS关键字球状旋转效果的实例代码
Nov 29 Javascript
Jquery 实现弹出层插件
Jan 28 Javascript
avalon js实现仿微博拖动图片排序
Aug 14 Javascript
javascript函数命名的三种方式及区别介绍
Mar 22 Javascript
Node.js批量给图片加水印的方法
Nov 15 Javascript
完美解决linux下node.js全局模块找不到的情况
May 16 Javascript
小程序实现带年月选取效果的日历
Jun 27 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
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
Javascript 获取LI里的内容
2008/12/17 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
jquery图片切换插件
2015/03/16 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
JSON遍历方式实例总结
2015/12/07 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
Ajax的概述与实现过程
2016/11/18 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
js中的闭包学习心得
2018/02/06 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
2018/08/09 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
vue中封装axios并实现api接口的统一管理
2020/12/25 Vue.js
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
Python中bisect的用法及示例详解
2020/07/20 Python
Python中Yield的基本用法
2020/10/18 Python
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
Shell如何接收变量输入
2016/08/06 面试题
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
vue+django实现下载文件的示例
2021/03/24 Vue.js
高中自我鉴定
2013/12/20 职场文书
酒店营销策划方案
2014/02/07 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书