投币条纹挑战阿尔·斯维加特的《用python自动化无聊的东西》

2024-06-25 22:35:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

以下是挑战:

硬币翻转条纹

对于这个练习,我们将尝试做一个实验。如果你掷硬币100次,每个正面写上“H”,每个反面写上“T”,你会创建一个类似“T”的列表。如果你让一个人随机掷100次硬币,你可能会得到交替的头尾结果,如“H T H T T T”,这看起来是随机的(对人类而言),但在数学上不是随机的。人类几乎永远不会连续写下六个正面或六个反面,即使这很可能发生在真正随机的抛硬币中。可以预见,人类不善于随机应变。编写一个程序,找出随机生成的正面和反面列表中出现六个正面或六个反面的条纹的频率。您的程序将实验分为两部分:第一部分生成随机选择的“正面”和“反面”值列表,第二部分检查其中是否有条纹。将所有这些代码放在一个循环中,重复实验10000次,这样我们就可以知道投币中有多少百分比的硬币连续包含六个正面或反面。作为提示,函数调用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))

Tags: of答案代码in程序列表that时间
1条回答
网友
1楼 · 发布于 2024-06-25 22:35:55

我认为这是解决问题的正确方法。这个问题有点模糊,但从表面上看,并以模板代码简单除以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'为True

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

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

相关问题 更多 >