<h2>此代码有几个问题:</h2>
<h2>1。此代码生成一个无限循环:</h2>
<p>只有当变量total_seq包含大于3的值时,内部while循环才终止<strong>。由于唯一可能分配给它的值是0和3(根据您的代码),这个while循环将永远持续下去。你知道吗</p>
<pre><code>...
total_seq = 0 #< -
while total_seq <= 3:
...
for toss in cointosses:
if toss == check1:
...
if seq_counter1 == 3:
total_seq = 3 #< -
break
if toss == check2:
...
if seq_counter2 == 3:
total_seq = 3 #< -
break
...
</code></pre>
<h2>2。你只需要在开始的时候翻动一次,然后一遍又一遍地使用这个结果</h2>
<p>你知道吗随机.randint(…)给你一个值,这个值存储在cointhows列表中(意思是:你只掷硬币一次)。<strong>内部for循环假定列表中已经存储了大量抛出。如果能找到3个连续的coinflips,它只会将total_seq设置为3<strong>。你知道吗</p>
<p>否则,它只会重复内部while循环并再次执行相同的操作,而不会添加新的coinflips<em>(外部while不会再次到达)</em></p>
<pre><code>tosses = random.randint(1,2)
...
if tosses == 1:
cointosses.append("heads")
if tosses == 2:
cointosses.append("tails")
...
for toss in cointosses:
...
if seq_counter1 == 3:
total_seq = 3
break
...
if seq_counter2 == 3:
total_seq = 3
break
...
</code></pre>
<h2>三。序列计数器<strong>seq_counter1和seq_counter2</strong>只有在前一个coinflip有不同结果时才会重置</h2>
<p>由于您只需要进行一次coinflip<em>(如问题2中所讨论的)</em>,所以“上一次coinflip”总是您进行的第一次coinflip。
这意味着您在开始时coinflip一次,并根据第一次翻转的结果将seq\u counter1或seq\u counter2递增到3。你知道吗</p>
<pre><code>...
seq_counter1 = 0
seq_counter2 = 0
...
while total_seq < 3:
...
if toss == check1:
seq_counter1 +=1
seq_counter2 = 0
...
if toss == check2:
seq_counter1 = 0
seq_counter2 +=1
...
...
</code></pre>
<h2>解决方案</h2>
<p>这三个问题都可以通过删除内部while循环并在外部while循环中执行其代码来解决:</p>
<pre><code>import random
cointosses = []
total_count = 0
while total_count >= 0:
tosses = random.randint(1,2)
total_count += 1
if tosses == 1:
cointosses.append("heads")
if tosses == 2:
cointosses.append("tails")
print(cointosses)
seq_counter1 = 0
seq_counter2 = 0
total_seq = 0
check1 = "heads"
check2= "tails"
for toss in cointosses:
if toss == check1:
seq_counter1 +=1
seq_counter2 = 0
if seq_counter1 == 3:
total_seq = 3
break
if toss == check2:
seq_counter1 = 0
seq_counter2 +=1
if seq_counter2 == 3:
total_seq = 3
break
if total_seq == 3:
break
</code></pre>
<p>这是因为条件<strong>total_seq==3</strong>已经由外循环中的最后一个if语句进行了测试。你知道吗</p>
<h2>结论</h2>
<p>然而,这段代码并不是很好,因为您构建了一个列表并反复迭代它。
每次追加一个cointost时,您都在迭代所有内容。但是如果您仔细想想:您只需要检查新附加的元素是否创建了一个连续的行。你知道吗</p>
<p>如果要正确执行此操作,应该只使用一个循环<em>(没有嵌套循环)</em>:)</p>