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 参考教程
Dec 29 Javascript
基于jquery完美拖拽,可返回拖动轨迹
Mar 29 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
Apr 07 Javascript
js实现透明度渐变效果的方法
Apr 10 Javascript
介绍JavaScript的一个微型模版
Jun 24 Javascript
百度搜索框智能提示案例jsonp
Nov 28 Javascript
jquery做个日期选择适用于手机端示例
Jan 10 Javascript
微信小程序 点击控件后选中其它反选实例详解
Feb 21 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
Apr 25 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
Aug 12 Javascript
jquery实现购物车基本功能
Oct 25 jQuery
Bootstrap实现前端登录页面带验证码功能完整示例
Mar 26 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解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
javascript 进阶篇2 CSS XML学习
2012/03/14 Javascript
JS打开图片另存为对话框实现代码
2012/12/26 Javascript
JS复制到剪贴板示例代码
2013/10/30 Javascript
jQuery常用操作方法及常用函数总结
2014/06/19 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
2016/08/11 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
判断iOS、Android以及PC端的示例代码
2018/11/15 Javascript
分析在Python中何种情况下需要使用断言
2015/04/01 Python
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
python Pygame的具体使用讲解
2017/11/03 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
Python docutils文档编译过程方法解析
2020/06/23 Python
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
皇家阿尔伯特英国官方商店:Royal Albert骨瓷
2019/03/25 全球购物
优秀员工评优方案
2014/06/13 职场文书
九年级化学教学反思
2016/02/22 职场文书
如何用python绘制雷达图
2021/04/24 Python
一文搞懂Redis中String数据类型
2022/04/03 Redis
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python