【问题标题】:Coin Flip Streaks Challenge - Al Sweigart's Automate The Boring Stuff with pythonCoin Flip Streaks Challenge - Al Sweigart 用 python 自动化无聊的东西
【发布时间】:2021-06-07 08:19:56
【问题描述】:

在互联网上寻找这个挑战的预期结果,我发现了不同的答案,所以我不确定什么是正确的。我认为我的代码看起来不错,结果 1.5% 但与其他代码不同。所以我正在寻找这个问题的正确答案。

挑战如下:

硬币翻转条纹

对于这个练习,我们将尝试做一个实验。如果你掷硬币 100 次,每个正面写一个“H”,每个反面写一个“T”,你会创建一个看起来像“T T T T H H H H T T”的列表。如果你让一个人随机掷 100 次硬币,你最终可能会得到交替的头尾结果,比如“H T H T H H T H T T”,这看起来是随机的(对人类来说),但在数学上并不是随机的。一个人几乎永远不会连续写下六个正面或六个反面,即使它很可能发生在真正随机的硬币翻转中。可以预见,人类不善于随机应变。编写一个程序,找出在随机生成的正面和反面列表中出现六个正面或六个反面的频率。您的程序将实验分为两部分:第一部分生成随机选择的“正面”和“反面”值列表,第二部分检查其中是否存在条纹。将所有这些代码放在一个循环中,重复实验 10,000 次,这样我们就可以找出有多少百分比的硬币翻转包含连续六个正面或反面的条纹。作为提示,函数调用 random.randint(0, 1) 将在 50% 的时间返回 0 值,在另外 50% 的时间返回 1 值。您可以从以下模板开始:

import random
numberOfStreaks = 0
for experimentNumber in range(10000):
    # Code that creates a list of 100 'heads' or 'tails' values.
    # Code that checks if there is a streak of 6 heads or tails in a row.
print('Chance of streak: %s%%' % (numberOfStreaks / 100))

【问题讨论】:

  • 嗨@CGO,欢迎来到该网站。您的问题在这里不是很清楚。你能澄清一下你是否认为你得到了错误的答案或什么?如果您的代码运行良好,而您只是想得到反馈,您可能想在Code Review 堆栈上提问,而不是在这里。至于您的代码本身,从问题措辞中我不清楚您是否应该计算条纹总数,或者您是否应该只计算一个有条纹的列表一次(也就是说,您是计算有条纹的列表的数量,而不是条纹的数量)。
  • 我很确定应该对包含任一条纹的任何实验计数一次。原因是模板代码中除以 100 是因为您将计数除以实验次数(10000),然后乘以 100 得到百分比,100/10000 是 1/100。百分比应该远高于 1.5% - 我得到大约 80%。 1.5% 是如果你试图在 6 次翻转中得到 6 个正面或 6 个反面 (0.5**6 * 100)
  • 嗨!是的,我正在寻找答案,真的。我也尝试包含我的代码以获取反馈,但我现在看到我可能已将其发布到“代码审查”堆栈。我会尝试编辑帖子。
  • 答案大约是 80%。

标签: python


【解决方案1】:

我认为这是解决问题的正确方法。这个问题有点模糊,但从表面上看,模板代码通过简单地除以 100 来计算最终百分比的逻辑支持,这很简单。除以 100 是因为 ((n/10000)*100) 与 (n/100) 相同。

import random

n_experiments = 10000
n_streaks = 0
six_heads = 'H' * 6
six_tails = 'T' * 6

for experiment in range(n_experiments):
    run = ''.join(random.choices('HT', k=100))
    if six_heads in run or six_tails in run:
        n_streaks += 1

print(f'Total runs with at least one streak: {n_streaks}')
print(f'Chance of streak: {(n_streaks / n_experiments * 100):.2f}%')

此代码生成一个长度为 100 的字符串,其中包含随机生成的字符 H 或 T。只需使用 in 运算符即可轻松地在字符串中搜索一系列字符,例如'HHHHHH' in 'THTHHHHHHTTTTHTH' 是真的。

此代码始终报告在每 100 次翻转中出现 6 个正面或反面的概率略高于 80%。

如果您将k 更改为 6,使得每个实验只有 6 次翻转,则结果约为 3%,这与计算的概率 3.125% = (1 * 0.5**5) * 100 一致。

【讨论】:

  • 太棒了!!!谢谢,我也觉得有点含糊。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2018-09-22
  • 2019-10-09
  • 2017-09-13
相关资源
最近更新 更多