原题:
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=25%. 也就是说我们要做的事情就是利用这个已有的生成器去构造一个 能均匀生成1到7的生成器。
这个问题看似有点无从入手,一个只能生成5个数的随机数生成器 怎么扩展到7个阿? 难道给(1,5)×(7/5)? 这样显然是不行的。因为相乘一个常数,结果产生5个数。
我们不妨换一个角度思考问题,如果这个题目换成要你生成(2,10)的随机数均匀生成器,那是不是简单了许多?你可能马上就想到了,我用(1,5)生成器 相继生成两个随机数,然后相加,他们的范围就是2~10 ,并且他们之间的分布是均匀的。 如果按着这个思路,我们就可以把这个题解答了。
上面的思想其实就是用(1,5) 生成器去扩展它的生成数范围,一次不行,我两次呢? 没错,我们先后取两次,然后把结果相乘,那么可以知道,这两个数相乘后的范围是1~25。 并且取到1~25 中间的任何一个数的可能性是相同的。21是7的3倍,于是我们就有了 这样的映射:
1~3 –> 1
4~6 -> 2
…
19~21->7
如果得到的数大于21,则重取。这样做,我们至少可以保证,生成的1~7的数的概率是相同的,因此也满足题目的要求。