概率生成问题
有一枚不均匀的硬币,要求产生均匀的概率分布 有一枚均匀的硬币,要求产生不均匀的概率分布,如 0.25 和 0.75 利用 Rand7() 实现 Rand10()
不均匀硬币 产生等概率
现有一枚不均匀的硬币 coin(),能够返回 0、1 两个值,其概率分别为 0.6、0.4。来源gaodai#ma#com搞@代~码$网要求使用这枚硬币,产生均匀的概率分布。即编写一个函数 coin_new() 使得它返回 0、1 的概率均为 0.5。
# 不均匀硬币,返回 0、1 的概率分别为 0.6、0.4 def coin(): return 0 if random.randint(1,10) > 4 else 1
统计抛两次硬币的结果的概率分布:
结果 0 1
0 0.60.6=0.36 0.60.4=0.24
1 0.40.6=0.24 0.40.4=0.16
连续抛两枚硬币得到 0 1 和 1 0 的概率分布是相同的。因此这道题的解法就是连续抛两次硬币,如果得到 0 1,返回 0;如果得到 1 0,返回 1;如果两次结果相同,则重新抛。
以此类推,无论这枚不均匀硬币的概率是多少,都可以用这种方法得到等概率的结果。
ddef coin_new(): while True: a = coin() if coin() != a: return a
完整测试代码:
def coin(): return 0 if random.randint(1,10) > 4 else 1 def coin_new(): while True: a = coin() if coin() != a: return a if __name__ == '__main__': a = 0 b = 0 n = 100000 for _ in range(n): if coin_new():a += 1 if coin():b += 1 print(f"1:{a/n},1:{b/n}")
均匀硬币 产生不等概率
现有一枚均匀的硬币 coin(),能够返回 0、1 两个值,其概率均为 0.5。要求编写一个函数 coin_new(),使得它返回指定的 0、1 概率分布。
# 均匀硬币 def coin(): return random.randint(0,1)
P(0) = 1/4,P(1) = 3/4
对于均匀硬币而言,连续抛两次,得到 0 0、0 1、1 0、1 1 的概率均为 1/4。显然,只需要连续抛两次硬币,如果得到 0 0,返回 0,其他情况返回 1。
def coin_new(): return coin() or coin()
P(0) = 1/3,P(1) = 2/3
连续抛两次硬币。如果得到 1 1,返回 0;如果得到 1 0 或 0 1,返回 1;如果得到 0 0,继续抛硬币。
def coin_new(): while True: a, b = coin(), coin() if a & b: return 0 if a | b: return 1
P(0) = 0.3,P(1) = 0.7
每抛一次硬币,会得到二进制数的一位,连续抛 4 次硬币,可以等概率生成 [0, 15] 的每个数,记为 x。去掉 [10, 15],剩下 [0, 9] 的每个数依然是等概率的。如果 x ∈ [ 0 , 2 ] x \in [0, 2] x∈[0,2],返回 0; x ∈ [ 4 , 9 ] x \in [4, 9] x∈[4,9],返回 1; x ≥ 10 x ≥ 10 x≥10,重复上述过程。
def coin_new(): while True: x = 0 for _ in range(4): x = (x << 1) + coin() if x <= 2: return 0 if x <= 9: return 1