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 相关文章推荐
Jquery时间轴特效(三种不同类型)
Nov 02 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
May 03 Javascript
微信小程序 增、删、改、查操作实例详解
Jan 13 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
Apr 20 Javascript
bootstrap table表格使用方法详解
Apr 26 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
Sep 27 Javascript
js中时间格式化的几种方法
Jul 22 Javascript
vuejs前后端数据交互之从后端请求数据的实例
Aug 11 Javascript
微信小程序通过js实现瀑布流布局详解
Aug 28 Javascript
vue 返回上一页,页面样式错乱的解决
Nov 14 Javascript
JavaScript实现模态对话框实例
Jan 13 Javascript
vue:el-input输入时限制输入的类型操作
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的FTP学习(二)
2006/10/09 PHP
自己在做项目过程中学到的PHP知识收集
2012/08/20 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
PHP中使用curl伪造IP的简单方法
2015/08/07 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
javascript 清空form表单中某种元素的值
2009/12/26 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
一个CSS+jQuery实现的放大缩小动画效果
2014/02/19 Javascript
js日期联动示例
2014/05/02 Javascript
alert出数组中的随即值代码
2014/09/25 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
最后说说Vue2 SSR 的 Cookies 问题
2018/05/25 Javascript
[04:44]DOTA2英雄梦之声_第12期_矮人直升机
2014/06/21 DOTA
python3批量删除豆瓣分组下的好友的实现代码
2016/06/07 Python
python字典快速保存于读取的方法
2018/03/23 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
python3实现猜数字游戏
2020/12/07 Python
在django中使用apscheduler 执行计划任务的实现方法
2020/02/11 Python
Html5游戏开发之乒乓Ping Pong游戏示例(三)
2013/01/21 HTML / CSS
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
监察建议书格式
2014/05/19 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
补充协议书
2015/01/28 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
同学聚会感言一句话
2015/07/30 职场文书
维护民族团结心得体会2016
2016/01/15 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python