数据

rand5(5):等概率生成整数[1, 2, 3, 4, 5]
rand5(7): 等概率生成整数[1, 2, 3, 4, 5, 6, 7]

思路

用(rand5(5) - 1)构造等概率整数数组:[0, 1, 2 , 3, 4], 用(rand5(5) - 1)*5 构造整数数组:[0, 5, 10, 15, 20], 上面的两个整数组可以构造等概率的新数组:[0, 1, 2, 3, 4, 5, 6, 7, .... , 24];
(如果第 2 个数组选择 2 倍或者 3 倍,4 倍则无法构造新的等概率数组)
选择新数组[0, 1, 2, 3 .... , 20]21 个元组即可构造等概率的数组[1, 2, 3, 4, 5, 6]

代码实现

python版本代码

1.import random
2.
3. def rand5():
4. return random.randint(1, 5)
5.
6. def rand7():
7.    while True:
8.       tmp_num = (rand5() - 1)*5 + (rand5() - 1)
9.       if tmp_num <= 20:
10.        break
11.      return tmp_num % 7 + 1
12.
13. # 随机生成 10000 个 1~7 的整数,验证 0~7 各个数字生成的概率;
14. ls = []
15. for _ in range(10000):
16. ls.append(rand7())
17. for i in range(1, 8):
18. print(ls.count(i)/len(ls), end=" ")
19. # out:0.144 0.1459 0.14 0.1438 0.1444 0.1373 0.1446
20. # 观察可知 0~7 各个数字生成的概率是等价的