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.extend函数扩展自己对象的js代码
Dec 09 Javascript
图片无缝滚动代码(向左/向下/向上)
Apr 10 Javascript
js Dialog 去掉右上角的X关闭功能
Apr 23 Javascript
javascript实现类似超链接的效果
Dec 26 Javascript
简单分析javascript面向对象与原型
May 21 Javascript
第十章之巨幕页头缩略图与警告框组件
Apr 25 Javascript
微信小程序 页面传值详解
Mar 10 Javascript
vue获取input输入值的问题解决办法
Oct 17 Javascript
vue实现微信获取用户信息的方法
Mar 21 Javascript
小程序云开发教程如何使用云函数实现点赞功能
May 18 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
May 19 jQuery
微信小程序入门之绘制时钟
Oct 22 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表单提交问题的解决方法
2011/04/12 PHP
PHP中使用数组指针函数操作数组示例
2014/11/19 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
php gd等比例缩放压缩图片函数
2016/06/12 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
使用laravel根据用户类型来显示或隐藏字段
2019/10/17 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
AngularJS实现表单手动验证和表单自动验证
2015/12/09 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
DVA框架统一处理所有页面的loading状态
2017/08/25 Javascript
bootstrap select下拉搜索插件使用方法详解
2017/11/23 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
2019/04/14 Javascript
Vue环境搭建+VSCode+Win10的详细教程
2020/08/19 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
写了个监控nginx进程的Python脚本
2012/05/10 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
keras.layer.input()用法说明
2020/06/16 Python
PyTorch安装与基本使用详解
2020/08/31 Python
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
Champion官网:美国冠军运动服装
2017/01/25 全球购物
资源工程专业毕业生求职信
2014/02/27 职场文书
人事部岗位职责范本
2014/03/05 职场文书
古汉语文学求职信范文
2014/03/16 职场文书
品牌推广活动策划方案
2014/08/19 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js