这是我面试百度实习二面遇到的算法题,很可惜,我没做出来。。。。

不过既然没有做出来,岂能善罢甘休!面试完通过思考,查询,终于把这题整出来了,也算是圆了一个小遗憾吧。

利用 1到7 的随机数产生一个 1到10的随机数,要求是等概率的。倘若不是等概率就很好做了,直接乘9之后再除以7就可以得到答案了。可是,这样没有达到要求。

我们可以先用1到7的随机数生成器减去1,rand7()-1这样就可以得到一个[0, 6]的随机数生成器,然后乘以7得到一个(0,7,14,21,28,35,42)的随机数生成器,然后都加上[0,6]就可以得到[0,48]的随机数生成器,然后进行对10取余,就可以得到[0,9]的随机数生成器了,但是为了概率相等,但凡生成的数字大于等于40的,都进行重复计算,直到落到[0,39]这个区间为止,最后[0,9]的结果再+1即是我们想要的结果。

代码如下:

int rand10()
{
    int a = rand7() - 1; //得到一个[0, 6]的随机数生成器
    int b = rand7() - 1; //要背加上的那个随机数生成器
    int n = 7*a + b;  //得到[0,48]的随机数生成器 
    if ( n >= 40 ) return rand10();  //生成的数字大于等于40的,都进行重复计算
    else return n%10 + 1;  //对10取余,然后+1即是答案
}

更多推荐

利用1到7的随机数,产生一个1到10的随机数