关于随机数的一道面试题
2014-09-15 15:57
239 查看
去一家IT公司面试,当时面试官问的,可惜没出来,后来上网搜了一下,找到了解决方案,
问题:已知随机数函数rand5(),可以均匀随机生成1~5,编写随机函数rand7(),可以随机生成1~7,并且保持均匀性。
当时,想的是rand5()+ rand5()%3,但是这样是无法保证期均匀性的。后来上网找到了一个解决办法:利用rand5()等概率随机生成1~25,然后去掉22~25,最后将结果%7+1,就等到等概率分布的1~7
代码:
首先解释为什么(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的时候截断,程序进入循环的概率降低。
问题:已知随机数函数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的时候截断,程序进入循环的概率降低。
相关文章推荐
- 一道关于随机数问题的程序解
- 关于一道微软面试题的解答
- 一道面试题:生成50个1到100之间的随机数,并且对其中的偶数进行降序排列 然后让他里面的数能够打乱,类似洗牌效果
- 关于索引的一道经典面试题(体现效率所在)
- 一道经典的关于Fibonacci数列的面试题(问题)的新想法 -> N阶楼梯问题
- 关于一道sql的面试题 (非常精典)
- 一道关于php变量引用的面试题
- 关于一道google面试题的java算法
- 一道关于JavaScript变量的面试题
- 关于索引的一道经典面试题(体现效率所在)(转)
- 一道关于字符串操作的面试题
- 一道关于容器的面试题
- 关于FOR循环的一道面试题
- 关于《程序员面试宝典》中的一道面试题的答案
- 关于一道面试题,使用C#实现字符串反转算法
- 关于一道微软面试题的思考
- 关于一道面试题
- 关于一道面试题
- 一道关于 SQLServer 交叉查询的 外企面试题
- 用代码验证阿里巴巴的一道关于男女比例的面试题