逻辑推理题目

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 = 0
  • 1 % 8 = 1
  • 2 % 8 = 2
  • 3 % 8 = 3
  • 4 % 8 = 4
  • 5 % 8 = 5
  • 6 % 8 = 6
  • 7 % 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到7

5、代码总结:

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值