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 一个自定义长度的文本自动换行的函数
Aug 19 Javascript
jquery 多行文本框(textarea)高度变化
Jul 03 Javascript
jquery 倒计时效果实现秒杀思路
Sep 11 Javascript
js判断数据类型如判断是否为数组是否为字符串等等
Jan 15 Javascript
jquery 通过name快速取值示例
Jan 24 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
Oct 17 Javascript
在JavaScript中使用NaN值的方法
Jun 05 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
Sep 01 Javascript
JS简单限制textarea内输入字符数量的方法
Oct 14 Javascript
JavaScript ParseFloat()方法
Dec 18 Javascript
easyui导出excel无法弹出下载框的快速解决方法
Nov 10 Javascript
iconfont的三种使用方式详解
Aug 05 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 结果集的分页实现代码
2009/03/10 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
2016/02/15 PHP
Laravel中Trait的用法实例详解
2016/03/16 PHP
Jquery iframe内部出滚动条
2010/02/11 Javascript
关于文本框的一些限制控制总结~~
2010/04/15 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
jQuery轻松实现无缝轮播效果
2017/03/22 jQuery
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
Vue.js实现输入框绑定的实例代码
2017/08/24 Javascript
jQuery实现的简单对话框拖动功能示例
2018/06/05 jQuery
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
Python星号*与**用法分析
2018/02/02 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
通过实例解析Python文件操作实现步骤
2020/09/21 Python
python利用platform模块获取系统信息
2020/10/09 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
销售主管的自我评价分享
2014/01/03 职场文书
女子职高个人自荐书
2014/02/01 职场文书
化妆师职业生涯规划书
2014/02/16 职场文书
网站创业计划书
2014/04/30 职场文书
收款委托书范本
2014/09/11 职场文书
成都人事代理协议书
2014/10/25 职场文书
学生检讨书范文
2014/10/30 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
职位证明模板
2015/06/23 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python