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

3
我有一个测试项目,其中某个实体可以发射子弹,根据击中方向和一些随机值,它可以影响或被偏转。离线运行时,通过使用random.randint()或random.random()等方法即可轻松生成随机数,以便告诉是否应该弹开。但我想通过UDP广播射击事件,以便其他客户端可以在屏幕上显示相同的实体/弹丸。由于弹丸速度非常高,因此我不能等待服务器告诉我过去的位置并仅使用该位置(虽然我可以更正弹道)。主要思路是从远程实体接收fire调用,获取一些值,例如position、velocity和randseed。我的问题是如何为每个实体使用种子?比如我在屏幕上同时有10颗子弹,每颗都有自己的伪随机种子,我想让子弹生成自己的伪序列,就像在网络的一侧或另一侧一样。

Example:

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

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

So that each instance has its own random sequence, not one shared by the random.seed() across each random.random() calls.

如何生成不同的伪随机序列?

如果这是一个坏主意,那么最好的方式是什么,可以广播一个触发事件,以便与所有客户端和服务器进行同步?

PS:服务器拥有完全的权限,同步是为了展示目的。

1个回答

3
使用 random.Random 类,例如:
self.randgen = random.Random(seed)

那么对 self.randgen.random()(或.randint(<int>))的调用将仅在您的实例中本地执行。

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


好的,那很快...我在random的文档中没有找到这个“Random”对象...但是在你提到它之后,它确实在文档中被提到了,尽管在一些将对象视为“隐藏”的段落中。我的错。非常感谢! - WKnight02

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接