趣题: 一道面试题的解法

原题:

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?

译文:

给定一个随机数生成器,这个生成器能均匀生成15(1,5)的随机数,如何使用这个生成器生成均匀分布的17(1,7)的数?

 

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

 

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

 

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

 

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

1~3 –> 1

4~6 -> 2

19~21->7

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

posted @ 2009-08-07 12:29  Andrew Zhu  阅读(220)  评论(0编辑  收藏  举报