投硬币

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/larryliuxinyu/article/details/51576348

2010年brain teaser(脑筋急转弯)题目还在各大IT公司的面试中流行,曾经在亚马逊有位美国人问了我一道题目:给一个rand5()的函数,可以均匀产生0到5的随机数。如何得到0到7的均匀分布的随机数。也就是要用rand5()实现一个rand7()。


这个题目如果改换一个说法,相信就容易多了:给你一个硬币,如何产生0到7的随机数?

方法自然是投硬币,我们规定正面为0,反面为1,连续投3次硬币,根据正反面共有8种组合:正正正,正正反,正反正,正反反,反正正,反正反,反反正,反反反,分别对应二进制数000到111,也就是0到7。


如何用rand5()实现扔硬币的效果呢?一个简单的方法就是通过奇偶性。为了增加趣味性,我们再提高一下难度,如果这个硬币有问题,正反两面出现的概率不等,如何解决呢?

方法是,扔两次,定义顺序”正反“为1,顺序”反正“为0,如果两次都是正,或者两次都是反,就重来。


在硬币正反出现机会不等的情况下,你能想出扔硬币次数更少的,均匀生成0到7以内随机数字的方法么?

阅读更多
换一批

没有更多推荐了,返回首页