首页 > 解决方案 > 创建一个随机列表并计算 6 个字母的序列

问题描述

我正在尝试构建一个程序,该程序将创建一个随机的正面或反面列表('H','T'),然后计算'H'或'T'重复6次的次数。我想我已经找到了随机列表,当我独立运行它时效果很好。但是当涉及到计数时,我不确定如何让 python 检测列表中 6 个相同字母的序列。

for x in range(0, len(coin_list)-1):
    if coin_list[x] == coin_list[x+1] and coin_list[x] == coin_list[x+2] and \
    coin_list[x] == coin_list[x+3] and coin_list[x] == coin_list[x+4] and \
    coin_list[x] == coin_list[x+5]:
       streak_counter+=1
    else:
        continue

    if streak_counter ==6: 
        numberOfStreaks+=1
        streak_counter=0
    else: 
        continue

首先,此块检查列表coin_list中的每个值,并检查其后面的所有 5 个值是否与第一个值相同。如果是,则streak_counter变量加一。然后程序检查streak_counter变量是否等于 6,如果是,则numberOfStreaks变量增加 1,并将streak_counter重置为 0。

当我运行这个程序时,我没有得到预期的结果。程序总是返回numberOfStreaks等于 0,因此条纹的百分比为 0%。

不知道我要去哪里错了。任何帮助将非常感激。

import random
numberOfStreaks = 0


for experimentNumber in range(10000):
    # Code that creates a list of 100 'heads' or 'tails' values.
    for i in range(100):
        coin_list=[]
        random_num=random.randint(0, 1)
        if random_num == 1:
            coin_list.append('H')
        elif random_num == 0:
            coin_list.append('T')

    # Code that checks if there is a streak of 6 heads or tails in a row.
    for x in range(0, len(coin_list)-1):
        if coin_list[x] == coin_list[x+1] and coin_list[x] == coin_list[x+2] and \
        coin_list[x] == coin_list[x+3] and coin_list[x] == coin_list[x+4] and \
        coin_list[x] == coin_list[x+5]:
           streak_counter+=1
        else:
            continue

        if streak_counter ==6: 
            numberOfStreaks+=1
            streak_counter=0
        else: 
            continue


print(numberOfStreaks)
print('Chance of streak: %s%%' % (numberOfStreaks / 100))

标签: pythonlistif-statementcounting

解决方案


当前实现有什么问题(代币列表的生成)

在生成列表的代码中,您为应该在列表中的每个条目创建一个空列表。

for i in range(100):
    coin_list=[]   # <-- here you create an empty list
    random_num=random.randint(0, 1)
    if random_num == 1:
        coin_list.append('H')
    elif random_num == 0:
        coin_list.append('T')

检查你的硬币列表的长度:

len(coin_list)

output: 1

修复它的想法

您可以通过在循环之外定义列表来解决此问题:

coin_list=[]
for i in range(100):

    random_num=random.randint(0, 1)
    if random_num == 1:
        coin_list.append('H')
    elif random_num == 0:
        coin_list.append('T')

由于您random无论如何都在使用,您可以查看random.choice

coin_list = []
coins = ['H', 'T']
for i in range(100):
    coin_list.append(random.choice(coins))

在这两种更正的情况下,列表的长度都是 100。

条纹计数有什么问题

接下来,streak_counter在被引用之前是没有定义的,所以应该定义:

streak_counter = 0

您编写的用于检查条纹的循环将遇到以下错误:

IndexError: list index out of range

这是因为您让x从 0 到列表的长度为 -1,但随后使用 x+2,3,4,5 访问列表项。当您的循环到达列表后面的第 4 个项目时,它将尝试访问列表之外的项目,从而导致错误。

for x in range(0, len(coin_list)-1):
    if coin_list[x] == coin_list[x+1] and coin_list[x] == coin_list[x+2] and \
    coin_list[x] == coin_list[x+3] and coin_list[x] == coin_list[x+4] and \
    coin_list[x] == coin_list[x+5]:  # < -- here you are accessing x+5
       streak_counter+=1
    else:
        continue

    if streak_counter ==6: 
        numberOfStreaks+=1
        streak_counter=0
    else: 
        continue

对此的解决方法是让x从 0 运行到len(list)-5,这将允许循环完成。但是,检查条纹的方式有点奇怪:

for x in range(0, len(coin_list)-5):
    print(x)
    if coin_list[x] == coin_list[x+1] and coin_list[x] == coin_list[x+2] and \
    coin_list[x] == coin_list[x+3] and coin_list[x] == coin_list[x+4] and \
    coin_list[x] == coin_list[x+5]:
        streak_counter+=1
    else:
        continue

if语句检查您的列表中是否有六个连续的相同条目。如果是这种情况,则增加streak_counter.

接下来,您检查是否streak_counter6,然后将其计为连续和增量numberOfStreaks

if streak_counter ==6: 
    numberOfStreaks+=1
    streak_counter=0
else: 
    continue

这里的问题是,对于 streak_counter 为 6,if coin_list[x] == ...条件必须满足六次。因此,您需要至少 11 个连续相同的值来记录连续 6 个。

试图修复它

现在,如何解决这个问题,我认为取决于您如何计算连胜数:7 个正面的序列是一个连胜七个,还是两个连胜六个?

对于前一种情况,您可以执行以下操作:

s = ''.join(coin_list) # convert everything to string

tails_streaks = []
heads_streaks = []

for tails in s.split('H'): # remove all heads and check if what remains is at least 6 long
    if len(tails) >=6:
        tails_streaks.append(len(tails))

for heads in s.split('T'): # ditto for tails
    if len(heads) >=6:
        heads_streaks.append(len(heads))

如果要计算所有出现的六个连续相同结果(这意味着多次计算一枚硬币):

tails_sixes = []
heads_sixes = []

for tails in s.split('H'):
    if len(tails) >=6:
        tails_sixes += 1 + len(tails) - 6 

for heads in s.split('T'):
    if len(heads) >=6:
        heads_sixes += 1 + len(tails) - 6

推荐阅读