其他分享
首页 > 其他分享> > C需要一个很好的技术来播种不使用time()的rand()

C需要一个很好的技术来播种不使用time()的rand()

作者:互联网

我有一个启动许多客户端进程的bash脚本.这些是人工智能游戏玩家,我用它来测试与许多玩家的游戏,大约有400个连接.

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

srand( time(nullptr) );

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

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

我考虑过使用类似的东西

srand( (int) this );

或类似的,基于每个实例都有唯一内存地址的想法.

还有另一种更好的方法吗?

解决方法:

当且仅当您想要可重复的结果时,才使用随机数种子.这对于地图生成这样的事情来说非常方便,您希望地图随机化,但您希望它可以根据种子预测为随机.

对于大多数情况,你不需要它,你想要实际的随机数,最好的方法是通过标准库生成器函数:

#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);

在这种情况下,不需要也不推荐种子. “随机设备”用于适当地播种PRNG(伪随机数发生器)以确保不可预测的结果.

同样,不要使用srand(time(NULL)),因为它是一个非常古老,非常糟糕的初始化随机数的方法,并且它是高度可预测的.在现代计算机上旋转一百万个可能的种子以找到匹配的输出是微不足道的.

标签:random-seed,c,random
来源: https://codeday.me/bug/20190910/1798649.html