首页 > 解决方案 > C++ 需要一种很好的技术来播种不使用 time() 的 rand()

问题描述

我有一个启动许多客户端进程的 bash 脚本。这些是 AI 游戏玩家,我用来测试有很多玩家的游戏,大约有 400 个连接。

我遇到的问题是 AI 播放器使用

srand( time(nullptr) );

但是如果所有玩家几乎在同一时间开始,他们将经常收到相同的 time() 值,这意味着他们都在同一个 rand() 序列上。

测试过程的一部分是确保如果大量客户端几乎同时尝试连接,服务器可以处理它。

我曾考虑过使用类似的东西

srand( (int) this );

或类似的,依靠每个实例都有一个唯一的内存地址的想法。

还有其他更好的方法吗?

标签: c++randomrandom-seed

解决方案


对伪随机生成器使用随机种子。

std::random_device是昂贵的随机数据。(昂贵的慢)你用它来播种prng算法。mt19937 是您将需要的最后一个 prng 算法。

如果需要,您可以选择通过分发来跟进它。即,如果您需要生成器提供的值以外的某个范围内的值。

std::random_device rd;
std::mt19937 generator(rd());

推荐阅读