随机列表生成不起作用

Posted

技术标签:

【中文标题】随机列表生成不起作用【英文标题】:Random List Generation not working 【发布时间】:2017-05-22 13:29:43 【问题描述】:

我正在开发一个需要为列表随机生成类的游戏。我使用自制函数randList 来做到这一点。该函数的代码如下所示:

def randList(options, num): #RANDOMLY SELECTS NUM ITEMS FROM LIST OPTIONS
returnVal = [] #CREATE A LIST THAT IT RETURNS
for i in range(num - 1): #FOR DESIRED NUMBER OF RETURN ITEMS
    val = r.choice(options) #RANDOMLY SELECT ITEM FROM OPTIONS
    returnVal.append(val) #ADD THAT TO RETURNVAL
    options.remove(val) #REMOVE IT FROM OPTIONS.
return returnVal #RETURN GENERATED LIST

我正在使用它在房间中随机生成怪物和物品,如下所示:

class roomParent: #ROOM CHARACTER FINDS
    def __init__(self, entities, floor): #INIT WITH ENEMIES IN ROOM, ITEMS ON FLOOR
        self.entities = entities #ENEMIES THERE ARE
        self.floor = floor #ON FLOOR THERE IS
    def generate(self):
        global enemiesBeat
        if enemiesBeat >= 500:
            self.entities = [dragon]
        else:
            self.entities = randList([goblin, dwarf, slime, naga, troll, beholder], 1)
        self.floor = randList([scrap, scrap, scrap, fireJar, ambrosia, sword, spearhead, armor, potion, slimeball], r.randint(0, 3))

room = roomParent([], [])

您知道,goblindwarfslimeball 等是在代码前面定义的。我不认为他们与这个问题有任何关系。我稍后像这样生成房间:

def main():
    room.generate()
    print("Enemies: " + str(room.entities))
main()

我希望它从room.generate() 打印出一个包含两个随机怪物的列表,但它总是打印Enemies: []。代码没有错误,在尝试排错 10 分钟后,我决定咨询他的网站,但没有任何结果。提前感谢您提供的任何帮助。

【问题讨论】:

为什么是for i in range(num - 1) 而不是for i in range(num) 另外你为什么将entitiesfloor作为参数传递给roomParent的构造函数?看起来您只需要在构造函数中将它们初始化为空列表,因为它们无论如何都会在 generate 方法中被分配。 正如@Tagc 所说,您使用range(num - 1) 而不是range(num)。在您的示例代码中,您将1 作为randList 的第二个参数传递,因此您的for 循环将是for i in range(1 - 1),它不会做任何事情。 【参考方案1】:

使用the random.sample library function.

此外,您可能需要重新考虑您的大小写...对于函数名称,snake_case 优于 inCaps。

【讨论】:

【参考方案2】:

正如 Oliver 指出的那样,您总是得到一个空的 entities 数组的原因是因为 self.entitiesgenerate 中设置为 randList([goblin, dwarf, slime, naga, troll, beholder], 1)(我假设全局变量 enemiesBeat 在您的测试)。

在您的 randList 函数中,您有一个我在 cmets 中提到的错误,这意味着生成的列表将包含比 num 指定的项目少一个。当您尝试为 self.entities (num = 1) 生成单例列表时,实际上会将其分配给一个空列表。

您可以通过在 randList 函数中将 for i in range(num - 1) 更改为 for i in range(num) 来纠正此问题。


顺便说一句,我认为您不需要将entitiesfloor 作为参数传递给roomParent 构造函数,因为它似乎没有任何效果。相反,您可以修改类定义:

class roomParent(object):
    def __init__(self):
        self.entities = []
        self.floor = []
    ...

然后像这样实例化它:

room = roomParent()

【讨论】:

以上是关于随机列表生成不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Mvc下拉列表不起作用

(webrtc) setRemoteDescription 对发起者不起作用

jquery悬停在我的列表项上不起作用

嵌套的可排序 JQuery 列表在 IE 中不起作用,而在 FF 中起作用

glColor 不起作用,出现随机颜色

创建 Oracle SQL Java 函数不起作用