我一直在自动化这些无聊的东西,并且正在尝试练习的问题。我想出了这个项目的解决方案清单上的章节-硬币条纹。
这个问题的目标是:“”对于这个练习,我们将尝试做一个实验。如果你抛硬币100次,在每个头上写一个“H”,为每条尾巴写一个“T”,你会创建一个类似于“T-T”的列表。如果你让一个人制造100个随机的硬币翻转,你可能会得到像“H T”这样的交替的头尾结果,这看起来是随机的(对人类而言),但不是数学上的随机。一个人几乎不会连续写下六个正面或六个尾巴的条纹,即使这很有可能发生在真正随机的硬币翻转中。可以预见,人类不善于随机应变。
编写一个程序,找出在随机生成的正面和反面列表中,一个由6个正面或6个尾组成的条纹出现的频率。您的程序将实验分为两部分:第一部分生成随机选择的“正面”和“尾部”值的列表,第二部分检查其中是否有条纹。把所有这些代码放在一个循环中,重复实验10,000次,这样我们就可以知道硬币翻转中有多少百分比包含了连续六个正面或反面的条纹。作为提示,函数调用random.randint(0,1)将返回0值50%的时间和1值的其他50%的时间。这是我的密码。
numberOfStreaks = 0
experiment = []
n = 0
for experimentNumber in range(1000):
    experimentNumber = experimentNumber + 1
    for test in range(100):
        selector = random.randint(0,1)
        if selector == 0:
            experiment = experiment + ['H']
        elif selector == 1:
            experiment = experiment + ['T']
    
    for n in range(94):
        if experiment[n:n+6] == ['T', 'T', 'T', 'T', 'T', 'T']:
            numberOfStreaks = numberOfStreaks + 1
        elif experiment[n:n+6] == ['H', 'H', 'H', 'H', 'H', 'H']:
            numberOfStreaks = numberOfStreaks + 1
        else:
            numberOfStreaks = numberOfStreaks
print((numberOfStreaks / 100000) * 100)我只能在1000个实验中有效地运行这个解决方案,书上说要运行10000,但要花费太长时间。我认为这源于我想出的算法的缺点。
如何使这个算法更有效?
发布于 2022-02-10 16:07:44
您可以通过只有一个for循环来简化它,这也消除了添加到列表中的需要,并且大大加快了速度。(10000在<1秒)
import random
numberOfStreaks = 0
experiment = []
n = 0
for experimentNumber in range(1000):
    heads=0
    tails=0
    
    for test in range(100):
        
        if random.randint(0,1):
            heads += 1
            tails = 0
        else:
            tails += 1
            heads = 0
        if heads >= 6 or tails >= 6:
            numberOfStreaks += 1
            
print((numberOfStreaks / 100000) * 100)https://stackoverflow.com/questions/71068072
复制相似问题