既然你“知道”你寻求的答案是 ~= 0.8:
我相信你误解了这个问题。我怀疑你真正想回答的问题是 Al Sweigart 的“Automate the Boring Stuff with Python”中的一个(不知名的)问题(强调我的):
如果你掷硬币 100 次......
... 编写一个程序来找出连续六个头或一个头的频率
六尾的条纹出现在随机生成的正面列表中,并且
尾巴。您的程序将实验分为两部分:第一部分
部分生成随机选择的“正面”和“反面”值列表,
第二部分检查其中是否有条纹。把这一切
循环中的代码,重复实验 10,000 次,所以我们可以找到
抛硬币的百分比(实验)包含
连续六个正面或反面。
第 1 部分(生成随机选择的“正面”和“反面”值列表):
observations = "".join(random.choice("HT") for _ in range(100))
第 2 部分(检查其中是否有条纹。):
has_streak = observations.find("H"*6) != -1 or observations.find("T"*6) != -1
Part Do Loop(将代码放入循环中,重复实验 10,000 次):
experimental_results = []
for _ in range(10_000):
observations = "".join(random.choice("HT") for _ in range(100))
has_streak = observations.find("H"*6) != -1 or observations.find("T"*6) != -1
experimental_results.append(has_streak)
部分获取结果(找出包含条纹的实验百分比):
print(sum(experimental_results)/len(experimental_results))
这应该给你一些接近:
0.8
完整代码:
import random
experimental_results = []
for _ in range(10_000):
observations = "".join(random.choice("HT") for _ in range(100))
has_streak = observations.find("H"*6) != -1 or observations.find("T"*6) != -1
experimental_results.append(has_streak)
print(sum(experimental_results)/len(experimental_results))
如果您想要回答的问题是:
平均而言,至少 6 次连续出现的次数
抛硬币 100 次是正面还是反面?
然后我们可以对它们进行计数并平均:
import random
def count_streaks(observations):
streaks = 0
streak_length = 1
prior = observations[0]
for current in observations[1:]:
if prior == current:
streak_length += 1
if streak_length == 6:
streaks += 1
else:
streak_length = 1
prior = current
return streaks
experimental_results = []
for _ in range(10_000):
observations = [random.choice("HT") for _ in range(100)]
observed_streaks = count_streaks(observations)
experimental_results.append(observed_streaks)
print(sum(experimental_results)/len(experimental_results))
这会给你一个大约的结果:
1.50
注意:
您的代码使用folge.count('TTTTTT')。我相信这段代码和任何使用类似策略的答案都可能(在 10k 次实验过程中)高估了答案,因为 ("H"*12).count("H"*6) 是 2 而不是 1。
例如:
@samwise (Probability of streak of heads or tails in sequence of coin tossing) 的这个出色的回答始终在以下范围内产生结果:
1.52