下面的 python 代码代表一个小的“游戏”:
我将硬币翻转 100 次,并获得一系列的头部和尾部
我试图弄清楚在这个序列中有多少次发生在彼此之后有 6 个头或 6 个尾。
我想运行这个 10000 次,然后计算每个序列的条纹的平均发生率。
我知道解决方案是每个序列大约有 0.8 条条纹,但我得到了 1.6 的数字,我无法弄清楚我做错了什么...我显然看到了其他解决方案,但我想弄清楚如何使这个特定的代码工作。
你能看看下面的代码,让我知道我做错了什么?
import random
numberOfStreaks = 0
possib = ['H', 'T']
folge = ''
x = 0
while x < 10000:
for i in range (100):
folge = folge + str(random.choice(possib))
numberOfStreaks = folge.count('TTTTTT') + folge.count('HHHHHH')
x = x + 1
print(numberOfStreaks)
既然你“知道”,你寻求的答案是~= 0.8:
我相信你误解了这个问题。我怀疑你真正想回答的问题是 Al Sweigart 的“用 Python 自动化无聊的东西”(强调我的):
如果你掷硬币 100 次...
...写一个程序,找出在随机生成的头尾列表中出现六头条纹或六尾条纹的频率。您的程序将实验分为两部分:第一部分生成随机选择的“头”和“尾”值的列表,第二部分检查其中是否有条纹。将所有这些代码放在一个循环中,该循环包含重复实验 10,000 次的 b / 条纹,因此我们可以找出a 行
第 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 循环(将代码放在重复实验 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
Full Code:
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))
但是,如果您要回答的问题是:
平均而言,100 次掷硬币中有多少次出现至少6 个连续的头或尾?
然后我们可以计算它们并平均如下:
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
Note:
您的代码使用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
每次通过x
循环,您都会附加到folge
,因此 10000 个不同的运行并不是相互独立的-您没有 10000 个不同的 100 个投掷集,您有一个 1000000 个投掷集(其中会有更多的条纹,因为您不会在 100 次投掷后“”它)。
你想要做的是计算每组 100 次投掷的条纹,然后取所有这些计数的平均值:
from random import choice
from statistics import mean
def count_streaks(folge: str) -> int:
return folge.count("TTTTTT") + folge.count("HHHHHH")
print(mean(
count_streaks(''.join(
choice("HT") for _ in range(100)
))
for _ in range(10000)
))
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(78条)