趣题: 一道面试题的解法

简介:
原题:
Given a random number generator which can generate the number in range (1,5) uniformly. How can you use it to build a random number generator which can generate the number in range (1,7) uniformly?
译文:
给定一个随机数生成器,这个生成器能均匀生成1到5(1,5)的随机数,如何使用这个生成器生成均匀分布的1到7(1,7)的数?

在解答这个问题之前,先要搞清楚均匀的含义,均匀就是说生成器取到范围之内的各个数的概率是相同的,比如(1,5)生成器取到每个数的概率均为1/5=20%.  也就是说我们要做的事情就是利用这个已有的生成器去构造一个 能均匀生成1到7的生成器。 

这个问题看似有点无从入手,一个只能生成5个数的随机数生成器 怎么扩展到7个阿? 难道给(1,5)×(7/5)? 这样显然是不行的。因为相乘一个常数,结果产生5个数。 

“我们不妨换一个角度思考问题,如果这个题目换成要你生成(2,10)的随机数均匀生成器,那是不是简单了许多?你可能马上就想到了,我用(1,5)生成器相继生成两个随机数,然后相加他们的范围就是2~10 ,并且他们之间的分布是均匀的。 如果按着这个思路,我们就可以把这个题解答了。”
update: 这段话又误,谢谢半瓶墨水提出来

上面的思想其实就是用(1,5) 生成器去扩展它的生成数范围,一次不行,我两次呢?没错,我们先后取两次,然后把结果相乘,那么可以知道,这两个数相乘后的范围是1~25。 并且取到1~25 中间的任何一个数的可能性是相同的。21是7的3倍,于是我们就有了 这样的映射:
1~3 –> 1
4~6 -> 2

19~21->7 
如果得到的数大于21,则重取。这样做,我们至少可以保证,生成的1~7的数的概率是相同的,因此满足题目的要求。



本文转自 xhinkerx 51CTO博客,原文链接:http://blog.51cto.com/xhinker/188923,如需转载请自行联系原作者
目录
相关文章
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
111 0
【变态面试题】【两种解法】不能创建临时变量(第三个变量),实现两个数的交换
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
235 6
(C语言版)力扣(LeetCode)面试题 17.04. 消失的数字5种解法
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
【基础算法】单链表的OJ练习(5) # 环形链表 # 环形链表II # 对环形链表II的解法给出证明(面试常问到)
【基础算法】单链表的OJ练习(5) # 环形链表 # 环形链表II # 对环形链表II的解法给出证明(面试常问到)
|
算法 C++
【每日算法Day 76】经典面试题:中序遍历的下一个元素,5大解法汇总!
【每日算法Day 76】经典面试题:中序遍历的下一个元素,5大解法汇总!
140 0
|
算法 C++
【每日算法Day 71】面试官想考我这道位运算题,结果我给出了三种解法
【每日算法Day 71】面试官想考我这道位运算题,结果我给出了三种解法
160 0
|
Rust 算法 JavaScript
阿里巴巴的算法面试题JAVA,python,go,rust js解法大全
阿里巴巴的算法面试题JAVA,python,go,rust js解法大全
342 0
|
存储 数据采集 算法
5种解法的算法面试题 来看看你是青铜还是王者?
5种解法的算法面试题 来看看你是青铜还是王者?
178 0
5种解法的算法面试题 来看看你是青铜还是王者?
|
存储 Rust JavaScript
2023java面试算法真题 python go rust js 解法
2023java面试算法真题 python go rust js 解法
194 0
|
Rust 算法 JavaScript
2023 java最新面试题 java python go rust js解法
2023 java最新面试题 java python go rust js解法
209 0