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 创建Dom元素
May 07 Javascript
js escape,unescape解决中文乱码问题的方法
May 26 Javascript
jQuery 实现自动填充邮箱功能(带下拉提示)
Oct 14 Javascript
JS获取浏览器语言动态加载JS文件示例代码
Oct 31 Javascript
同一个网页中实现多个JavaScript特效的方法
Feb 02 Javascript
12个超实用的JQuery代码片段
Nov 02 Javascript
js基于cookie记录来宾姓名的方法
Jul 19 Javascript
基于bootstrap实现广告轮播带图片和文字效果
Jul 22 Javascript
jQuery实现邮箱下拉列表自动补全功能
Sep 08 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
Oct 10 Javascript
webpack教程之webpack.config.js配置文件
Jul 05 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
Dec 09 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数组内存耗用太多问题的解决方法
2010/04/05 PHP
PHP文件读写操作之文件写入代码
2011/01/13 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
2014/07/31 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
2017/01/12 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
详解webpack介绍&安装&常用命令
2017/06/29 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
vue设计一个倒计时秒杀的组件详解
2019/04/06 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
VUE 组件转换为微信小程序组件的方法
2019/11/06 Javascript
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
简单了解Python生成器是什么
2019/07/02 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
大学毕业生简单自荐信
2013/11/05 职场文书
优秀的毕业生的自我评价
2013/12/12 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
晚会邀请函范文
2014/01/24 职场文书
设备动力科岗位职责范本
2014/02/23 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
2016年“世界环境日”校园广播稿
2015/12/18 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书