题解
这题关键在于创造的随机数分布要均衡。
先看这个比较trick的解法。
int rand10() {
int i,j;
while( (i=rand7())<6 );// 让i分布于 6 or 7 则P(i=6 or 7)=0.5
while( (j=rand7())>5 );// 让 j 分布于 1-5 则P(j=1:5) = 0.2
return (i&1)? j:j+5;
}
这个算是一个通用的解法,解答一切randM生成randN(M<N)见详细题解
介绍下大概思路,比如 rand7 生成 rand10;
设法用 rand7 生成49 算法就是 7*(rand7()-1) + rand7()-1
注意到此时生成的49每个数的分布律都是 1/49 即平均分布。
我们再取得 前40个数 显然这40个数也是等概率生成的,
那答案就很自然了,mod10 +1 取得个位数就好。
int rand10() {
int tmp=40;
while( tmp>=40 ) tmp = 7*(rand7()-1) + rand7()-1;
return tmp%10 + 1;
}