题目是这样的:一个随机数生成器可以等概率生成1到5的整数,每次生成一个数,要求用它等概率生成1到7整数
这里可以推理出由1到5的空间到1到7的空间,线性关系肯定不行,可以想到用生成器生成2、3...次组合起来.等概率地生成1到7。
综合和同学讨论的结果,有以下两种方式是可以的:
一、使用两次生成器,两次的结果组合成一个整数分别为十位数和个位数,如下排列:
11 21 31 41 51
12 22 32 42 52
13 23 33 43 53
14 24 34 44 54
15 25 35 45 55
共有5*5个数,这25个数是等概率生成的,有如下两个关系,
关系一:
11、32、53、25 mod 7 余 4;
21、42、14、35 mod 7 余 0;
31、52、24、45 mod 7 余 3;
41、13、34、55 mod 7 余 6;
51、23、44 mod 7 余 2;
12、33、54 mod 7 余 5;
22、43、15 mod 7 余 1;
这里25个数可以包容3个7,多出四个数,当组合出的数是{25,35,45,55}中的数时,则假设这种情况失败,重新生成,其它数可以等概率生成0-6,然后加上1即可等概率地得到1-7。
关系二:
用数组int[5*5]来存放这25个数,数11到55对应数组下标0-24;
每个组合数出来后,其在数组中对应下标(下标为21、22、23、24除外,处理情况同上)mod 7后也等概率得到0-6,加1后即得到1-7。
二、使用8次生成器,将结果相加,得8-40共33个数,它们等概率生成。(个人推荐这种方法,我同学几分钟就想出来)
将这些数mod 8后可得:
5个0;
4个1;
4个2;
4个3;
4个4;
4个5;
4个6;
4个7;
共33个数,当得到0时假设这种情况失败,重新生成,则可等概率得到1-7。