已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。
这类问题的解决思路无外乎是将rand7求两遍,利用某种方法巧妙的构造出连续的一组数。上题的解决思路如下:
1. rand7执行两次,出来的数为a1=rand7()-1,a2=rand7()-1。
2. 如果a17+a2<40,b=(a17+a2)/4+1;如果a1*7+a2>=40,重复第一步。
简单的加减不能使用是因为加法每个结果出现的概率不同,例如:加法得到7的概率明显高于加法得到14或者2的概率,而乘法得到的结果又不够连续,不易得出1~10。
于是我们选择了a1*k+a2的思路,对于k的取值问题:
-
k<7:出现同加法同样的问题,就是每个结果出现的概率不同;
-
k>7:结果不连续;
-
k=7:每个结果出现的概率都是1/49,且结果连续,合适。下面计算每个结果出现的概率。
对于0~48出现的概率为1/49,这个很容易,因此,做a1*7+a2后出现的概率为:
4/49+(9/49)*4/49+(9/49)*(9/49)*(4/49)+......=4/49*(1/(1-9/49))=1/10
因此以上方法可以实现rand7()构造rand10()。