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:ajax实现翻页无刷新功能代码
Aug 05 Javascript
jQuery中toggle()函数的使用实例
Apr 17 Javascript
jQuery限制图片大小的方法
May 25 Javascript
jQuery动态修改字体大小的方法【测试可用】
Sep 09 Javascript
利用angular.copy取消变量的双向绑定与解析
Nov 25 Javascript
Javascript中return的使用与闭包详解
Jan 11 Javascript
Bootstrap模态框使用详解
Feb 15 Javascript
vue.js中$set与数组更新方法
Mar 08 Javascript
详解vue 自定义marquee无缝滚动组件
Apr 09 Javascript
js console.log打印对象时属性缺失的解决方法
May 23 Javascript
JavaScript实现五子棋游戏的方法详解
Jul 08 Javascript
vue-cli脚手架的.babelrc文件用法说明
Sep 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
检查用户名是否已在mysql中存在的php写法
2014/01/20 PHP
PHP函数strip_tags的一个bug浅析
2014/05/22 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
thinkPHP模板中函数的使用方法示例
2016/11/30 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
初学prototype,发个JS接受URL参数的代码
2006/09/25 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
2017/06/02 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
JS栈stack类的实现与使用方法示例
2019/01/31 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
在微信小程序中使用mqtt服务的方法
2019/12/13 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
对python字典元素的添加与修改方法详解
2018/07/06 Python
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
中班开学寄语
2014/04/04 职场文书
2014最新开业庆典策划方案(5篇)
2014/09/15 职场文书
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript