2017-08-28 25 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.seed()在每個random.random()調用共享。

如何生成不同的僞隨機序列?

如果這不是一個好主意,那麼廣播一個觸發事件的最佳方法是什麼,以便它與所有客戶端+服務器有點同步?

PS:服務器具有完全權限,同步用於顯示目的。

回答

3

使用random.Random類,例如:

self.randgen = random.Random(seed) 

然後調用self.randgen.random()(或.randint(<int>))將是您的本地實例。

或者,您可以創建一個使用self.state = random.getstate()然後random.setstate(self.state)每次調用random.random()

+0

那麼之前的包裝,那是快......它發生,我沒有在'random'找到這個'Random'對象的文件......但是在你提到它之後,文件中確實提到了它,儘管在某些段落中該對象被認爲是「隱藏的」。我的錯。非常感謝 ! – WKnight02