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 文字符串转换unicode编码函数
May 30 Javascript
JavaScript 弹出窗体点击按钮返回选择数据的实现
Apr 01 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
Nov 25 Javascript
兼容主流浏览器的iframe自适应高度js脚本
Jan 10 Javascript
node.js中的fs.existsSync方法使用说明
Dec 17 Javascript
JS实现让访问者自助选择网页文字颜色的方法
Feb 24 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
Jul 07 Javascript
获取JS中网页各种高宽与位置的方法总结
Jul 27 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
Aug 08 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
Oct 09 Javascript
解决Window10系统下Node安装报错的问题分析
Dec 13 Javascript
js实现二级联动简单实例
Jan 11 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
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
php实现邮件发送并带有附件
2014/01/24 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
PHP输出XML格式数据的方法总结
2017/02/08 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
JavaScript中的typeof操作符用法实例
2014/04/05 Javascript
checkbox选中与未选中判断示例
2014/08/04 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
Python使用flask框架操作sqlite3的两种方式
2018/01/31 Python
python使用tensorflow深度学习识别验证码
2018/04/03 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
python实现函数极小值
2019/07/10 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
法国购买二手电子产品网站:Asgoodasnew
2020/03/27 全球购物
党员个人思想汇报
2013/12/28 职场文书
大学生涯自我鉴定
2014/01/16 职场文书
医德医风演讲稿
2014/05/20 职场文书
党性心得体会
2014/09/03 职场文书
学校副校长四风对照检查材料整改措施
2014/09/25 职场文书
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
民主评议党员个人总结
2015/02/13 职场文书
小学生班干部竞选稿
2015/11/20 职场文书
MySQL去除重叠时间求时间差和的实现
2021/08/23 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技