关于随机数的一道面试题

去一家IT公司面试,当时面试官问的,可惜没出来,后来上网搜了一下,找到了解决方案,

问题:已知随机数函数rand5(),可以均匀随机生成1~5,编写随机函数rand7(),可以随机生成1~7,并且保持均匀性。

当时,想的是rand5()+ rand5()%3,但是这样是无法保证期均匀性的。后来上网找到了一个解决办法:利用rand5()等概率随机生成1~25,然后去掉22~25,最后将结果%7+1,就等到等概率分布的1~7

代码:

int rand5();

int rand7(){
   int rst = 0;
   do{
      rst = (rand5()-1)*5 + rand5();
   }while(rst > 21);
   return rst %7 + 1;
}

首先解释为什么(rand5()-1)*5+rand5()可以等概率的生成1~25,因为这就好比,将1~25这一列,分成5个slot,每个slot里面有5个items,(rand5()-1)*5这部分相当于,分别访问5个slot的,然后rand5()是访问该slot内的item,用于访问slot,以及其中的item概率都是1/5,所以,这样就产生了1~25等概率的随机数。

还有一个问题就是,为什么在大于21的时候截断,而不是直接大于7的时候截断,最后直接返回呢?因为如果在大于7的时候截断,这样程序进入循环的概率(25-7)/25,在大于21的时候截断,程序进入循环的概率降低。

原文地址:https://www.cnblogs.com/suiyu/p/3972999.html