我试图从MMO游戏或类似游戏中创建随机生成的“特权分配”。
规则如下:
到目前为止,我们所拥有的只是:
import random
# Variables
cont = [0, 0, 0, 0, 0]
items = 20
maxNum = 5
# Start our first loop
i = 0
while items != 0:
i = 0
while i < len(cont) - 1:
num1 = random.randint(3, maxNum)
if items < 5:
if cont[i] = 00:
cont[i] += items
items = 0
break
cont[i] = num1
if cont[i] == 5:
maxNum = 4
i += 1
items = items - num1
print(items)
print(cont)
这有时会结束,但有时它会陷入循环而无法正常工作。
这段代码的正确方式是每次输出时都会打印出来:
请帮我解决为什么它有时会卡在循环中!谢谢!
答案 0 :(得分:1)
它有时会卡在循环中,因为您的代码可能会生成一个案例,其中已分配了所有5个统计信息,但items
仍然不是0。
const = [3,3,3,3,3]
而items = 5
。即使在const = [5,4,4,4,0]
的情况下,我们在随机数上滚动4,即使您发现items < 5
的情况,并将剩余的值转储到最后的统计数据中,更改也会在下一个数据中被覆盖无论如何,你在哪里使用cont[i] = num1
。
因此,首先,cont[i] = num1
的赋值需要在else语句中。此外,我读这个唯一可能的方式是所有值都是4,或者一个值是5,一个值是3,其余都是4.你正在抓住只有这样的情况是一个5,但反过来也只能有一个3,否则它总共不能达到20.所以为minNum
添加一个类似maxNum
的捕获。此外,您不需要外部循环,因为我们的逻辑现在确保最终值为20. items < 5
检查也需要items <= 5
,以便允许转储5进入最终价值。我自己尝试过,似乎工作正常。
最终结果:
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)
我没有尝试为您创建更有效的答案,而是专注于纠正您现有的解决方案:)
答案 1 :(得分:0)
在开始时将最大点数随机分配到一个容器中会更容易,然后再填充其余容器。
from random import randint
def assign(num_containers, container_max, max_points):
containers = [0]*num_containers
full_container = randint(0, num_containers-1)
containers[full_container] = container_max
assigned = container_max
while assigned < max_points:
cont = randint(0, num_containers-1)
if cont is not full_container and containers[cont] < container_max - 1:
containers[cont] += 1
assigned += 1
return containers