关于随机数的一道面试题

去一家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的时候截断,程序进入循环的概率降低。

 

posted on   碎雨  阅读(756)  评论(0编辑  收藏  举报

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示