<p>它有时会陷入循环中,因为您的代码可以生成这样一种情况:所有5个stats都已分配,但<code>items</code>仍然不是0。你知道吗</p>
<p>例如,如果它一直将3分配给列表中的每个项目,那么我们将得到<code>const = [3,3,3,3,3]</code>和<code>items = 5</code>。即使在<code>const = [5,4,4,4,0]</code>的情况下,我们在随机数上掷4,即使您捕捉到<code>items < 5</code>的情况,因此要将剩余的值转储到最后一个stat中,更改仍然会在您使用<code>cont[i] = num1</code>的下一行被覆盖。你知道吗</p>
<p>因此,首先,<code>cont[i] = num1</code>的赋值需要在else语句中。另外,我读这个的方式,唯一的可能性是要么所有的值都是4,要么一个值是5,一个值是3,其余的都是4。你发现只有一个5,但是反过来也只有一个3,否则不可能全部加起来是20。所以为<code>minNum</code>添加一个catch,就像为<code>maxNum</code>添加catch一样。另外,您实际上不需要外循环,因为我们的逻辑现在确保最终值为20。<code>items < 5</code>检查也需要是<code>items <= 5</code>,以便允许将5转储到最终值中。我自己也试过了,好像很管用。你知道吗</p>
<p>最终结果:</p>
<pre><code>import random
# Variables
cont = [0, 0, 0, 0, 0]
items = 20
maxNum = 5
minNum = 3
# Start our first loop
i = 0
while i < len(cont):
num1 = random.randint(minNum, maxNum)
if items <= 5:
cont[i] = items
else:
cont[i] = num1
if cont[i] == 5:
maxNum = 4
if cont[i] == 3:
minNum = 4
items -= cont[i]
i += 1
print(cont)
</code></pre>
<p>我没有尝试为您创建一个更有效的答案,而是专注于纠正您现有的解决方案尝试:)</p>