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版)
May 03 Javascript
jquery ready函数、css函数及text()使用示例
Sep 27 Javascript
jquery插件validation实现验证身份证号等
Jun 04 Javascript
javascript文本模板用法实例
Jul 31 Javascript
bootstrap实现弹窗和拖动效果
Jan 03 Javascript
浅谈window.onbeforeunload() 事件调用ajax
Jun 29 Javascript
JavaScript中三种常见的排序方法
Feb 24 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
May 09 Javascript
spirngmvc js传递复杂json参数到controller的实例
Mar 29 Javascript
Vue 3.x+axios跨域方案的踩坑指南
Jul 04 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
Oct 10 Javascript
使用vue重构资讯页面的实例代码解析
Nov 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实现httpclient类示例
2014/04/08 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
Date对象格式化函数代码
2010/07/17 Javascript
jquery实现文本框鼠标右击无效以及不能输入的代码
2010/11/05 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
基于Electron实现桌面应用开发代码实例
2020/07/07 Javascript
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
基于Pytorch SSD模型分析
2020/02/18 Python
python mysql中in参数化说明
2020/06/05 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
J2EE面试题集锦(附答案)
2013/08/16 面试题
授权委托书范文
2014/07/31 职场文书
就业协议书盖章的注意事项
2014/09/28 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
Oracle 临时表空间SQL语句的实现
2021/09/25 Oracle
MySQL数据库之内置函数和自定义函数 function
2022/06/16 MySQL