问题:对于质地均匀的硬币,连续两次得到正面所需的次数数学期望是多少?
关键词:抛硬币、均匀、连续、两次正面
一些分析:
次成功所需要的平均次数。
次硬币才会出现
连正的情况。
我们可以通过建立一个递归关系来解决这个问题。设
为得到连续两次正面所需的抛掷次数的期望值。我们可以将问题分解为以下几种情况:
),然后我们就处于了一个新的状态,即下一次抛掷如果再次得到正面,游戏结束;否则,我们回到初始状态。设从这个状态开始,直到游戏结束所需的期望抛掷次数为
。
),这时我们仍然处于初始状态,因为我们一次正面也没有得到过。设从这个状态开始,直到游戏结束所需的期望抛掷次数为
。
由于
(因为它们都代表从游戏开始直到结束的期望抛掷次数),我们可以建立以下等式:
对于
,如果第二次抛掷得到正面(概率为
),游戏结束;如果得到反面(概率为
),则回到初始状态
。因此有:
联立解这两个方程,我们可以求出
的值为 6。
另一种推导:
此外,当抛掷的硬币不均匀时,即正面的概率不再是
,通项公式为:
代入不同的
(要求连续出现的次数)和
(正面的概率)就能得到准确结果。
下面这段代码的主要功能是通过模拟实验来估计在一系列硬币投掷中,得到连续
次正面的平均所需次数(即数学期望)。这个问题在概率论和统计学中很常见,尤其是在研究随机过程和伯努利试验时。代码通过大量模拟来近似实际的数学期望值,这种方法在理论值难以直接计算时特别有用。
import random
def simulate_coin_toss(n, p):
"""模拟投掷硬币直到出现连续 n 次正面"""
# 记录投掷次数和连续正面的次数
count, consecutive_heads = 0, 0
while consecutive_heads < n:
# random() 方法返回一个在 [0,1) 范围内的随机实数
if random.random() < p: # 随机投掷硬币,得到正面的概率为 p。
consecutive_heads += 1
else:
consecutive_heads = 0 # 如果得到反面,重置连续正面的计数。
count += 1 # 每次投掷都增加计数
return count
def calculate_expected_value(num_simulations, n, p):
"""计算得到连续 n 次正面所需次数的数学期望"""
# 记录所有模拟的总次数
total_count = 0
for _ in range(0, num_simulations):
total_count += simulate_coin_toss(n, p)
return total_count / num_simulations # 计算平均次数作为数学期望的近似值
# 质地均匀的硬币,得到连续两次正面所需次数的数学期望是?
# 示例:模拟 1000000 次投掷
num_simulations = 1000000
# 正面的概率
positive_probability = 0.5
# 连续出现次数
successive_times = 2
expected_value = calculate_expected_value(num_simulations,
successive_times,
positive_probability
)
print(f"经过 {num_simulations} 次模拟,得到连续 {successive_times} 次正面所需次数的数学期望近似为:{expected_value:.2f}")
# 程序运行结果如下:
# 经过 1000000 次模拟,得到连续 2 次正面所需次数的数学期望近似为:6.00
代码解释:
random
模块,它提供了生成随机数的函数,用于模拟投掷硬币的随机性。
n
表示连续出现正面的次数目标,p
表示每次投掷得到正面的概率。当达到连续出现指定次数的正面后,函数返回总的投掷次数。
num_simulations
、连续出现正面的目标次数 n
和每次投掷得到正面的概率 p
。将累加的总投掷次数除以模拟次数,得到平均投掷次数,作为连续两次正面所需次数的近似期望值。
该算法的时间复杂度为 O(n)
,其中 n 是模拟投掷的次数。这是因为我们需要对每次模拟投掷进行计数,直到满足条件为止。空间复杂度为 O(1)
,因为我们只使用了固定数量的变量来存储投掷次数和连续正面的计数。
使用通项公式直接计算,其时间复杂度和空间复杂度均为 O(1)
。以下是一个代码示例:
def expected_number_of_tosses(n, p):
"""
计算得到连续 n 次正面所需的抛掷硬币次数的数学期望。
Return:
float:连续 n 次正面所需的抛掷次数的数学期望。
"""
return (p ** (-n) - 1) / (1 - p)
# 正面的概率
positive_probability = 0.5
# 连续出现次数
successive_times = 2
result = expected_number_of_tosses(successive_times,
positive_probability
)
print(f"得到连续 {successive_times} 次正面所需次数的数学期望是: {result}")
# 程序运行结果如下:
# 得到连续 2 次正面所需次数的数学期望是:6.00
📚️ 相关链接: