我有一个构建随机数量的对象实例的函数。为了展示一般的想法,我们假装这是一个算法来构建一系列类似nethack的房间。
要求是这样的,我不知道预先会有多少个实例;这些都是随机生成的。
简要说明:我完全清楚以下代码是无效的,但应该(希望!)证明我的目标。
import random
class Levelbuild(object):
def __init__(self):
self.l1 = dict({0:'a',1:'b',2:'c',3:'d',4:'e',5:'f',6:'g',7:'h',8:'i'})
# Pick a random number between 4 and 9.
for i in range(random.randint(4,9)):
self.l1[i] = Roombuilder()
如果我们假设所选的随机整数是5,理想的结果将是5个Roombuilder()实例;分别标记为a,b,c,d和e。
有一种简单的方法吗?有没有办法做这个时期?
- 编辑 -
巨人“谢谢”Nick ODell的回答。这不是一个完整的复制/粘贴 - 但它是一个适合我需要的变体;
import random
class Room(object):
def __init__(self):
self.size = (5,5)
class Level(object):
def __init__(self):
roomnames = ['a','b','c','d','e','f','g','h','i']
self.rooms = {}
for i in range(random.randint(4, 9)):
self.rooms[roomnames[i]] = Room()
而不是手工建立每个“房间”,我现在可以......
test = Level()
print test.rooms['a'].size
>>> (5,5)
答案 0 :(得分:3)
import string
import random
class Levelbuild(object):
def __init__(self,min_room_count,max_room_count):
rooms_temp = [new RoomBuilder() for i in range(random.randint(min_room_count,max_room_count))]
self.l1 = dict(zip(string.ascii_lowercase, rooms_temp))
注意:如果超过26个房间,这将无声地失败。
答案 1 :(得分:0)
{...}
已经是一个字典,所以将它包装在dict()
中并没有做任何事情。)
roomnames = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
self.rooms = []
for i in range(random.randint(4, 9)):
self.rooms.append(Roombuilder(roomnames[i]))
对于它的价值,将builder
放在一个类的名称中有点时髦。对象是房间,对吗?所以类型应该是Room
。
答案 2 :(得分:0)
作为更通用解决方案的另一个答案(主要作为Nick ODell's answer的伴侣),如果你想处理任意数量的名称,那么这是一个非常简单的无限生成器解决方案:
import string
import itertools
def generate_names(characters):
for i in itertools.count(1):
for name in itertools.product(characters, repeat=i):
yield "".join(name)
然后您可以像使用任何其他生成器一样使用它:
>>>print(dict(zip(generate_names(string.ascii_lowercase), range(30))))
{'aa': 26, 'ac': 28, 'ab': 27, 'ad': 29, 'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3, 'g': 6, 'f': 5, 'i': 8, 'h': 7, 'k': 10, 'j': 9, 'm': 12, 'l': 11, 'o': 14, 'n': 13, 'q': 16, 'p': 15, 's': 18, 'r': 17, 'u': 20, 't': 19, 'w': 22, 'v': 21, 'y': 24, 'x': 23, 'z': 25}
如果您需要生成实际的名称,那么您有几个选择。如果您需要一个真实的单词,请从字典文件中选择(大多数Linux用户在/usr/share/dict
中有一个)。如果你需要类似文字的东西,那么我实际上已经写了a Python script to generate such 'words' using Markov Chains,它可以在GPL下找到。当然,你必须检查这些是否具有独特性。