随机数的组合问题(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,但是问题来了:所谓随机函数,产生的每个值的概率是相等的,但是上面的方法产生的值概率相等吗?我们可以使用概率论的组合知识算岀来:生成1有一种组合,就是random5() + 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,5,10,15,20,用它去跟random5()相加,因为random5()的可选值是1, 2,3,4,5,所以两者相加之后就会得到1-25之间的随机数,而且产生的每个值的组合均只有一种,所以它们的概率也是相等的。
也许有人会问,(random5() - 1) * 5,这里为什么是乘以5而不是其他呢?这是因为乘以5之后和random5()相加,得到的数是连续的并且是等概率的。
上面讨论的都是特殊情形1-5和1-7之间的转换,对于其他的一般情形,大家可以自己试试哈。
随机数的组合问题(JavaScript描述)的更多相关文章
- 翻阅《数据结构与算法javascript描述》--数组篇
导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...
- 数据结构与算法javascript描述
<数据结构与算法javascript描述>--数组篇 导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScri ...
- 正则表达式 - JavaScript描述
正则表达式 - JavaScript描述 概述 正则表达式是被用来匹配字符串中的字符组合的模式.在JavaScript中,正则表达式也是对象. 创建正则表达式 var re = /abc/; // 使 ...
- 十大经典排序算法总结(JavaScript描述)
前言 读者自行尝试可以想看源码戳这,博主在github建了个库,读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算法总结 这世界 ...
- 《数据结构与算法JavaScript描述》
<数据结构与算法JavaScript描述> 基本信息 作者: (美)Michael McMillan 译者: 王群锋 杜欢 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9 ...
- 列表的实现-----数据结构与算法JavaScript描述 第三章
实现一个列表 script var booklist = new List(); booklist.append('jsbook'); booklist.append('cssbook'); book ...
- 《数据结构与算法JavaScript描述》中的一处错误
最近在看<数据结构与算法JavaScript描述>这本书,看到选择排序这部分时,发现一个比较大的错误. 原书的选择排序算法是这样的: function selectionSort() { ...
- 数据结构与算法 Javascript描述
数据结构与算法系列主要记录<数据结构与算法 Javascript描述>学习心得
- 读书笔记《数据结构与算法JavaScript描述》第一章
第一章JavaScript的编程环境和模型 1.2JavaScript编程实践 1.2.1 声明和初始化变量 JavaScript中的变量默认为全局变量,如果初始化未被声明的变量,该变量就成了一个全局 ...
随机推荐
- CentOS7设置阿里镜像
1. 备份原来的yum源 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2.设置ali ...
- C# --- ??(空接合操作符)的一个案例
Nullable<Int32> x = null; Nullable<Int32> y = null; Nullable<Int32> z = null; Int3 ...
- python __init__.py 的作用
__init__.py的主要作用是: . Python中package的标识,不能删除 . 定义__all__用来模糊导入 . 编写Python代码(不建议在__init__中写python模块,可以 ...
- Qt-Designer打不开
安装Qt后双击桌面的Designer没有反应,解决办法就是将安装路径里的qwebengineview.dll文件后缀名加个".bak".
- Vue(二) 计算属性
模板内的表达式常用于简单的运算,当过长或逻辑复杂时,难以维护,计算属性就是解决该问题的 什么是计算属性 表达式如果过长,或逻辑更为复杂,就会变得臃肿甚至难以维护,比如: <div> {{ ...
- 网络编程—网络基础概览、socket,TCP/UDP协议
网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...
- spoj Minimax Triangulation
题解: dp+计算几何 F[i][j]表示第i-j条边的答案 然后转移一下 代码: #include<bits/stdc++.h> using namespace std; ]; ][]; ...
- ES6新特性,对象的快速创建
//es6对象快速赋值 //es5对象赋值 var name="xiaoming"; var age=18 var person={ name:name, age:age } co ...
- Caffe中Interp层的使用
最近实验当中借鉴了FPN网络,由于FPN网络对图片shape有要求,采用了两种方式,其一是在data_layer.cpp中,对原图进行padding操作:其二是需要对特征图进行类似crop操作,使得两 ...
- php优秀框架codeigniter学习系列——CI_Router类学习
这篇文章主要介绍CI核心框架工具类CI_Router. 如果说CI_URI类是用来解析URI,那么CI_Router类就应该是根据解析出来的URI来决定究竟访问哪一个文件和哪一个function. 详 ...