3

乱数のオブジェクト インスタンスを作成する関数があります。一般的なアイデアを示すために、これが一連のネットハックのような部屋を構築するためのアルゴリズムであると仮定します。

要件は、事前にいくつのインスタンスがあるか分からないようなものです。これらはランダムにオンザフライで生成されます。

簡単なメモ: 次のコードが機能しないことは十分承知していますが、(できれば!) 私の目的を示す必要があります。

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)
4

3 に答える 3

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 を超える部屋が指定されている場合、これは警告なしで失敗します。

于 2012-04-25T20:21:03.207 に答える
0

より一般的な解決策の別の答えとして(主にNick ODellの答えのコンパニオンとして、任意の数の名前を処理する場合は、無限のジェネレーターを使用した非常に単純な解決策です。

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ユーザーはに1つあります/usr/share/dict)。単語のようなものが必要な場合は、GPLで利用できるマルコフ連鎖を使用してそのような「単語」を生成するPythonスクリプトを実際に作成しました。当然、これらの一意性を確認する必要があります。

于 2012-04-25T20:32:48.740 に答える
0

実際、あなたはかなり近いです。口述は必要ありません。リストを使用するだけです。(ちなみに、{...}すでにdictであるため、それをラップしても何も起こり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

于 2012-04-25T20:17:23.970 に答える