3

手続き的に生成されたレベルを使用するゲームを作成しています。テストするときは、レベルを再現したいと思うことがよくあります。今のところ、レベルを保存する方法はありませんが、より簡単な解決策は、Pythonのランダムモジュールで使用されるシードを再利用することだと思いました。しかし、私は両方random.seed()を使用してみましたがrandom.setstate()、どちらも結果を確実に再現するようには見えません。奇妙なことに、シードを再利用すると、同じレベルが数回続けて取得されることがありますが、完全に100%信頼できるわけではありません。レベルを通常どおりに(その情報を含むファイルとして)保存する必要がありますか?

編集:

みんな助けてくれてありがとう。私の問題は、Pygameのグループからランダムにスプライトを選択していたという事実に起因していることがわかりました。スプライトは順序付けられていない辞書ビューで取得されます。その部分にPygameのスプライトグループを使用しないようにコードを変更しましたが、現在は完全に機能しています。

4

4 に答える 4

7

random.seed正常に動作するはずですが、スレッドセーフではないことに注意してください。乱数が同時に他の場所で使用されている場合、実行間で異なる結果が得られる可能性があります。

その場合は、のインスタンスを使用しrandom.Random()てプライベート乱数ジェネレーターを取得する必要があります

>>> import random
>>> seed=1234
>>> n=10
>>> random.Random(seed).sample(range(1000),n)
[966, 440, 7, 910, 939, 582, 671, 83, 766, 236]
>>> 

特定のシードに対して常に同じ結果を返します

于 2010-01-26T23:25:45.747 に答える
1

ランダム関数によって生成される数は決定論的です。したがって、既知の値でシードして保存します。次の乱数からレベルを作成します。レベルをロードするには、同じ既知の値を再度シードし、「乱数」を再度使用します。これは、同じ順序で繰り返し発生します。これは言語に依存しませんが、Pythonの場合、 gnibblerが指摘しているようにスレッド化に注意してください。

この正確なテクニックは、伝説のゲームエリートの巨大な世界を作成するために実際に使用されました。あなたが勇敢であるならば、イアン・ベルがそれをどのようにしたかをチェックしてください。;)

于 2010-01-26T23:37:34.903 に答える
1

レベルを生成するときにランダムに生成されるすべての結果に対してデータスロットを持つlevelRandomクラスを作成するのが最善です。次に、ランダム生成コードをレベル構築コードから分離します。新しいレベルが必要な場合は、最初に新しいlevelRandomオブジェクトを生成し、次にそのオブジェクトをレベルジェネレーターに渡してレベルを生成します。後で、同じレベルを再度取得するには、levelRandomインスタンスを再利用できます。

于 2010-01-26T23:26:09.720 に答える
0

別のレベルが必要になった時点で、最初に別のlevelRandomオブジェクトを作成し、そのオブジェクトをレベルジェネレーターに渡してレベルを生成する必要があります(使用している場合)

于 2020-11-10T20:23:05.197 に答える