这是我面试百度实习二面遇到的算法题,很可惜,我没做出来。。。。
不过既然没有做出来,岂能善罢甘休!面试完通过思考,查询,终于把这题整出来了,也算是圆了一个小遗憾吧。
利用 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的随机数
发布评论