趣题: 一道面试题的解法

原题:
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,如需转载请自行联系原作者

你可能感兴趣的:(趣题: 一道面试题的解法)