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 陷阱 window全局对象
Nov 26 Javascript
JQuery的Validation插件中Remote验证的中文问题
Jul 26 Javascript
封装html的select标签的js操作实例
Jul 02 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
Dec 10 Javascript
JavaScript使用addEventListener添加事件监听用法实例
Jun 01 Javascript
微信小程序调用PHP后台接口 解析纯html文本
Jun 13 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
Dec 12 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
Apr 24 Javascript
vue的三种图片引入方式代码实例
Nov 19 Javascript
nodemon实现Typescript项目热更新的示例代码
Nov 19 Javascript
如何使用three.js 制作一个三维的推箱子游戏
Jul 29 Javascript
教你使用vscode 搭建react-native开发环境
Jul 07 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 socket(fsockopen)的应用实例分析
2013/06/02 PHP
php与Mysql的一些简单的操作
2015/02/26 PHP
php中的登陆login实例代码
2016/06/20 PHP
用javascript实现改变TEXTAREA滚动条和按钮的颜色,以及怎样让滚动条变得扁平
2007/04/20 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
2018/04/17 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
爬虫利器Puppeteer实战
2019/01/09 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
[52:06]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python中from module import * 的一个坑
2014/07/20 Python
详解Python如何获取列表(List)的中位数
2016/08/12 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
centos 安装Python3 及对应的pip教程详解
2019/06/28 Python
解决python 读取excel时 日期变成数字并加.0的问题
2019/10/08 Python
Pandas DataFrame中的tuple元素遍历的实现
2019/10/23 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
Python实现序列化及csv文件读取
2020/01/19 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
协议书的格式
2014/04/23 职场文书
2015年公务员个人工作总结
2015/04/24 职场文书
交通事故调解协议书
2015/05/20 职场文书
教师见习总结范文
2015/06/23 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
2016大一新生军训心得体会
2016/01/11 职场文书
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis
HDFS免重启挂载新磁盘
2022/04/06 Servers
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技