Python3:如何为每个对象生成伪随机序列?

时间:2017-08-28 04:31:23

标签: python random synchronization generator python-3.5

我有一个测试项目,其中一些实体可以发射子弹,并且根据命中方向和一些随机值,它可以影响或被偏转。

当离线运行时,它很容易在移动中生成随机数,以便判断镜头是否应该弹跳,与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:服务器具有完全权限,同步用于显示目的。

1 个答案:

答案 0 :(得分:3)

使用random.Random类,例如:

self.randgen = random.Random(seed)

然后,对self.randgen.random()(或.randint(<int>))的调用将是您实例的本地调用。

或者,您可以在每次调用self.state = random.getstate()之前创建一个使用random.setstate(self.state)然后random.random()的包装器