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实现的仿Flash广告图片轮换效果
Apr 24 Javascript
Jquery下:nth-child(an+b)的使用注意
May 28 Javascript
javascript中一些util方法汇总
Jun 10 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
Dec 18 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
Dec 30 Javascript
基于jquery实现表格无刷新分页
Jan 07 Javascript
浅谈javascript中遇到的字符串对象处理
Nov 18 Javascript
全选复选框JavaScript编写小结(附代码)
Aug 16 Javascript
vue2中的keep-alive使用总结及注意事项
Dec 21 Javascript
详解Node.js异步处理的各种写法
Jun 09 Javascript
vue+koa2实现session、token登陆状态验证的示例
Aug 30 Javascript
Axios代理配置及封装响应拦截处理方式
Apr 07 Vue.js
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扩展ZF――Validate扩展
2008/01/10 PHP
php xfocus防注入资料
2008/04/27 PHP
php max_execution_time执行时间问题
2011/07/17 PHP
教你php如何实现验证码
2016/01/20 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
IE与firefox之jquery用法区别
2008/10/03 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
JavaScript事件委托用法分析
2015/01/24 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
复杂的javascript窗口分帧解析
2016/02/19 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
2017/10/13 jQuery
vue自定义一个v-model的实现代码
2018/06/21 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
利用原生JavaScript实现造日历轮子实例代码
2019/05/08 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
由面试题加深对Django的认识理解
2019/07/19 Python
Django之PopUp的具体实现方法
2019/08/31 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
django-利用session机制实现唯一登录的例子
2020/03/16 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
清华大学自主招生自荐信
2014/01/29 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
2016年母亲节寄语
2015/12/04 职场文书