【问题标题】:Python MMO Generation & DistributionPython MMO 生成和分发
【发布时间】:2017-02-15 15:50:21
【问题描述】:

我正在尝试从 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)

这有时会起作用,但有时它会卡在循环中而无法正常工作。

这段代码可以正确的方式是每次输出时都会打印:

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

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

【问题讨论】:

  • 你说它“有时”有效。这表明随机语句有时会生成一个导致错误的数字。每次生成时尝试打印“num1”,看看循环是否总是从相同的数字失败。如果您自己没有解决,请将结果编辑到您的答案中。
  • 循环“卡住”是什么意思?它会崩溃吗?如果是这样,请发布完整的错误跟踪。
  • @Gloin 我们已经做到了,最终它创建了一个比项目更大的数字并减去更大的数字并导致它进入负数并无限重复。
  • 为什么分配 cont[i] = items,然后 cont[i] = num1?第一条语句总是被第二条覆盖
  • 我看不出这段代码“有时”是如何工作的。当前的 sn-p 只在每一行上打印 20 而没有结束。

标签: python random containers


【解决方案1】:

有时会卡在循环中,因为您的代码可能会生成所有 5 个统计信息都已分配但 items 仍然不是 0 的情况。

例如,如果它一直为列表中的每个项目分配 3,那么我们最终会得到 const = [3,3,3,3,3]items = 5。即使在const = [5,4,4,4,0] 的情况下,我们在随机数上滚动 4,即使您发现items &lt; 5 的情况,因此将剩余值转储到最后一个统计数据中,更改会在您使用的下一行被覆盖cont[i] = num1 反正。

所以,首先,cont[i] = num1 的赋值需要在 else 语句中。另外,我读这篇文章的唯一可能性是所有值都是 4,或者一个值是 5,一个值是 3,其余的都是 4。你发现只能有一个 5,但反过来也只能有一个 3,否则它不能全部加起来 20。所以像 maxNum 一样为minNum 添加一个捕获。此外,您实际上并不需要外部循环,因为我们的逻辑现在确保最终值为 20。items &lt; 5 检查也需要为items &lt;= 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)

我没有尝试为您创建更有效的答案,而是专注于纠正您现有的解决方案尝试:)

【讨论】:

    【解决方案2】:

    一开始只将最大数量的点随机分配到一个容器中,然后再填充其余部分会更容易。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 2012-05-01
      • 1970-01-01
      • 2011-08-11
      • 2019-04-10
      • 1970-01-01
      • 2017-05-25
      相关资源
      最近更新 更多