PythonMMO生成与管理;分布

PythonMMO生成与管理;分布,python,random,containers,Python,Random,Containers,我试图从MMO游戏或类似游戏中创建一个随机生成的“特权分配” 规则如下: 一个容器中必须有5个,并且只能有1个容器中有5个 所有20分都必须分配 点必须由RNG分配(使用随机) 到目前为止,我们所拥有的只是: 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 &

我试图从MMO游戏或类似游戏中创建一个随机生成的“特权分配”

规则如下:

  • 一个容器中必须有5个,并且只能有1个容器中有5个
  • 所有20分都必须分配
  • 点必须由RNG分配(使用随机)
到目前为止,我们所拥有的只是:

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)
随机导入
#变数
cont=[0,0,0,0,0]
项目=20
maxNum=5
#开始我们的第一个循环
i=0
而项目!=0:
i=0
而i
这有时会起作用,但有时它会陷入循环中而不起作用

此代码的正确方式是,每次输出时,它都会打印:

  • [5,4,4,3]
  • [4,4,4,4,4]
  • [5,4,3,4,4]
  • 等等

请帮我解决为什么有时它会卡在循环中!谢谢大家!

在开始时,只需将最大点数随机分配到一个容器中,然后再填充剩余的点数,这将更容易

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
来自随机导入randint
def分配(容器数、容器最大值、最大点数):
容器=[0]*num_容器
完整容器=randint(0,数量容器-1)
容器[满容器]=容器最大值
分配=容器的最大值
分配
它有时会陷入循环,因为您的代码可能会生成一种情况,即所有5个统计数据都已分配,但
项仍然不是0

e、 例如,如果它一直将3分配给列表中的每个项目,那么我们将得到
const=[3,3,3,3]
,而
items=5
。即使在
const=[5,4,4,4,0]
的情况下,我们在随机数上滚动一个4,即使你捕捉到
items<5
的情况,并将剩余值转储到最后一个stat中,在下一行使用
cont[i]=num1
时,更改也会被覆盖


因此,首先,
cont[i]=num1
的赋值需要在else语句中。还有,我读这篇文章的方式,唯一的可能是所有的值都是4,或者一个值是5,一个值是3,其余的都是4。你会发现只有一个5,但反过来也只有一个3,否则不可能加起来都是20。因此,为
minNum
添加一个catch,就像为
maxNum
添加catch一样。此外,您实际上不需要外循环,因为我们的逻辑现在确保最终值为20。
items<5
检查也需要是您所说的“有时”有效的
项。这表明,随机语句有时会生成一个导致错误的数字。尝试在每次生成“num1”时打印它,查看循环是否总是从相同的数字失败。如果你没有自己解决问题,请将结果编辑到你的答案中。你所说的循环“卡住”是什么意思?它会崩溃吗?如果是这样的话,请将完整的错误跟踪发回。@Gloin我们已经这样做了,结果是它创建了一个比项目大的数字,减去了更大的数字,并使其变成负数并无限重复。为什么要将cont[i]=items赋值,然后cont[i]=num1?第一条语句总是被第二条语句覆盖,我不知道这段代码“有时”是如何工作的。当前代码段每行只打印20个,没有结尾。
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)