The*_*ule 6 c++ random random-seed
我有一个启动许多客户端进程的bash脚本.这些是人工智能游戏玩家,我用它来测试与许多玩家的游戏,大约有400个连接.
我遇到的问题是AI播放器使用的问题
srand( time(nullptr) );
Run Code Online (Sandbox Code Playgroud)
但是如果所有玩家大约在同一时间开始,他们将经常收到相同的time()值,这意味着他们都在同一个rand()序列中.
测试过程的一部分是确保如果大量客户端几乎同时尝试连接,服务器就可以处理它.
我考虑过使用类似的东西
srand( (int) this );
Run Code Online (Sandbox Code Playgroud)
或类似的,基于每个实例都有唯一内存地址的想法.
还有另一种更好的方法吗?
当且仅当您想要可重现的结果时,才可以使用随机数种子。这对于诸如地图生成之类的事情非常方便,您希望地图是随机的,但您希望它根据种子是可预测的随机的。
在大多数情况下,您不希望这样,您实际上需要随机数,而最好的方法是通过标准库生成器函数:
#include <random>
std::random_device rd;
std::map<int, int> hist;
std::uniform_int_distribution<int> dist(0, 5);
int random_die_roll = dist(rd);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,不需要也不建议使用种子。“随机设备”负责正确播种 PRNG(伪随机数生成器),以确保不可预测的结果。
再次强调,不要使用它srand(time(NULL)),因为它是一种非常古老、非常糟糕的初始化随机数的方法,而且它的可预测性很高。在现代计算机上,旋转一百万个可能的种子来找到匹配的输出是微不足道的。