<h3>当前实现(生成硬币列表)有什么问题
<p>在生成列表的代码中,为列表中的每个条目创建一个空列表</p>
<pre><code>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')
</code></pre>
<p>检查硬币清单的长度:</p>
<pre><code>len(coin_list)
output: 1
</code></pre>
<h3>修复它的想法</h3>
<p>可以通过在循环外部定义列表来解决此问题:</p>
<pre><code>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')
</code></pre>
<p>由于您正在使用<code>random</code>,因此可以查看<code>random.choice</code>:</p>
<pre><code>coin_list = []
coins = ['H', 'T']
for i in range(100):
coin_list.append(random.choice(coins))
</code></pre>
<p>在这两种情况下,列表的长度都是100</p>
<h3>条纹计数有什么问题
<p>接下来,<code>streak_counter</code>在被引用之前没有定义,因此应该定义它:</p>
<pre><code>streak_counter = 0
</code></pre>
<p>为检查条纹而写入的循环将遇到以下错误:</p>
<pre><code>IndexError: list index out of range
</code></pre>
<p>这是因为您允许<code>x</code>从0到列表的长度-1,然后使用x+2,3,4,5访问列表项。当循环到达列表后面的第四个项目时,它将尝试访问列表之外的项目,从而导致错误</p>
<pre><code>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
</code></pre>
<p>解决方法是让<code>x</code>从0运行到<code>len(list)-5</code>,这将允许循环完成。
但是,检查条纹的方式有点奇怪:</p>
<pre><code>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
</code></pre>
<p><code>if</code>语句检查列表中是否有六个连续的、相同的条目。如果是这种情况,则增加<code>streak_counter</code></p>
<p>接下来,检查<code>streak_counter</code>是否为<code>6</code>,然后将其计为一条条纹并增加<code>numberOfStreaks</code></p>
<pre><code>if streak_counter ==6:
numberOfStreaks+=1
streak_counter=0
else:
continue
</code></pre>
<p>这里的问题是,对于streak_计数器为6,必须满足<code>if coin_list[x] == ...</code>条件六次。因此,您需要至少11个连续的相同值来注册6个条纹</p>
<h3>试图修复它</h3>
<p>现在,如何解决这个问题,我想取决于你如何计算条纹:一个7个头的序列是一个7的条纹,还是两个6的条纹</p>
<p>对于前一种情况,您可以这样做:</p>
<pre><code>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))
</code></pre>
<p>如果要计算六个连续相同结果的所有出现次数(这意味着要将一枚硬币数数多次):</p>
<pre><code>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
</code></pre>