抛硬币顺序中头或尾的平均条纹数(heada or tails)

下面的 python 代码代表一个小的“游戏”:

的 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)
1

既然你“知道”,你寻求的答案是~= 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
1

每次通过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)
))

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(698)
什么是鞭打为什么会发生(thrashing in os)
上一篇
具有循环 /分组的邮件合并(excel mail merge)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(47条)