2017-08-28 18 views
3

私は、いくつかのエンティティが弾を発射できるテストプロジェクトを持っています。ヒットの方向といくつかのランダムな値に応じて、それは影響を与えたり、偏向したりすることがあります。Python3:オブジェクトごとに擬似ランダムシーケンスを生成する方法は?

random.randint()またはrandom.random()のように、ショットがうねっているかどうかを判断するために、オフラインで実行すると、外出先で乱数を生成するのは簡単です。

しかし、私はUDPを介して発射イベントをブロードキャストしようとしているので、他のクライアントは画面上に同じエンティティ/発射物を表示することができます。

プロジェクタは非常に高速ですので、サーバーが過去の位置を教えて、それを使用するのを待つことができません(私は軌道を修正することができます)。主な考え方は、リモートエンティティからfireコールを受信し、position, velocity, randseedなどの値を取得することです。

私の問題は、どのエンティティごとにシードを使用するのですか?

私は自分の画面上に一度に10個の弾丸を持っていますが、それぞれが独自の擬似乱数の種を持っています。弾丸がネットワークの片側にあるように独自の擬似シーケンスを生成します。

例:

class Bullet(object): 
    def __init__(self, pos, v, seed): 
     self.randgen = InstanciableGenerator(seed) 
     # ... 

    def hit(self, pos, ...): 
     currentRandom = self.randgen.get() 
     # ... 

各インスタンスは独自のランダムな順序ではなく、各random.random()呼び出しにわたってrandom.seed()によって共有される1つを持つように。

別個の疑似ランダムシーケンスを生成する方法は?

悪い考えであれば、発射イベントをブロードキャストする最良の方法は何でしょうか?すべてのクライアント+サーバーといくらか同期していますか?

PS:サーバーには完全な権限があり、同期は表示用です。

答えて

3

例えば、random.Randomクラスを使用します。:

self.randgen = random.Random(seed) 

を次にself.randgen.random()(または.randint(<int>))への呼び出しは、あなたのインスタンスにローカルになります。

また、あなたがrandom.random()

+0

まあへの各呼び出しの前に、その後self.state = random.getstate()random.setstate(self.state)を使用するラッパーを作成することができ、それは簡単だった...私が 'random'にこの' Random'オブジェクトが見つからなかったことが起こりますしかし、あなたがそれに言及した後、オブジェクトが「隠された」とみなされるいくつかの段落ではあるが、実際にはドキュメンテーションで言及されていた。私の悪い。どうもありがとう ! – WKnight02

関連する問題