1、一个函数随机生成0-4的数字,如何通过这个函数得到0-7的随机数(概率相等)
解决方法:拒绝采样 + 映射
步骤:
1、假设题目所给随机生成0-4的数字的函数为:rand4()
2、生成 0 到 24 之间的数字:
我们通过调用 `rand4()` 两次来生成一个 0 到 24 之间的数字。(可以想象成设计一个5进制的2位数,高位和低位均由rand4()表示)具体方法如下:
def rand24(): return rand4() * 5 + rand4()- 调用两次 `rand5()`,第一次生成的数字乘以 5,加上第二次生成的数字。
- 这样我们就能得到一个范围从 0 到 24 的数字(共 25 个不同的数字)。
3、拒绝采样:
我们可以通过对所得数字%8的操作来获取0-7之间的数字
由于 25 不能被 8 整除,直接用 0 到 24 的数字映射到 0 到 7 会导致概率不均匀。
如下:
对于0-7的数字:
0 % 8 = 01 % 8 = 12 % 8 = 23 % 8 = 34 % 8 = 45 % 8 = 56 % 8 = 67 % 8 = 7对于 8 - 15 ,16 - 23 的数字,均会映射到 0 - 7 ,但是24 % 8 = 0
所以 1 - 7 都会出现3次而0会出现4次。
为了解决这个问题,我们使用拒绝采样的策略:
我们只接受生成的数字在 0 到 23 之间的数字。这样,我们有 **24 个可能的数字**(0 到 23),确保每个数字(0 到 7)出现的次数是相等的。
4、将 0 到 23 映射到 0 到 7:
通过对生成的数字进行 % 8 运算,我们将 0 到 23 之间的数字均匀地映射到 0 到 7 之间。
如下:
def rand7(): while True: num = rand24() # 生成一个0到24之间的数字 if num < 24: # 只接受0到23之间的数字 return num % 8 # 将0到23之间的数字映射到0到75、代码总结:
def rand4():# 你提供的生成0到4的随机数的函数 def rand24(): return rand5() * 5 + rand5() def rand7(): while True: num = rand24() # 生成一个0到24之间的数字 if num < 24: # 只接受0到23之间的数字 return num % 8 # 将0到23之间的数字映射到0到7
1520

被折叠的 条评论
为什么被折叠?



