最好的答案是<random>
。如果您使用的是 C++11 之前的版本,您也可以查看 Boost random number stuff。
但是,如果我们在谈论rand()
和最好srand()
的最简单的方法就是使用:time()
int main()
{
srand(time(nullptr));
...
}
请务必在程序开始时执行此操作,而不是每次调用时都执行此操作rand()
!
边注:
注意:下面的评论中讨论了这是不安全的(这是真的,但最终不相关(继续阅读))。因此,另一种选择是从随机设备/dev/random
(或其他一些安全的实数(er)随机数生成器)中播种。但是:不要让这让你陷入一种虚假的安全感。这是rand()
我们正在使用的。即使您使用出色生成的种子播种它,它仍然是可预测的(如果您有任何值,您可以预测下一个值的完整序列)。这仅对生成"pseudo"
随机值有用。
如果您想要“安全”,您可能应该使用<random>
(尽管我会在安全通知网站上做更多阅读)。请参阅下面的答案作为起点:https ://stackoverflow.com/a/29190957/14065以获得更好的答案。
次要注意:使用随机设备实际上比我下面的原始建议更好地解决了每秒启动多个副本的问题(只是不是安全问题)。
回到原来的故事:
每次启动时, time() 都会返回一个唯一值(除非您每秒启动应用程序多次)。在 32 位系统中,它只会每 60 年左右重复一次。
我知道你认为时间不够独特,但我觉得这很难相信。但众所周知,我是错的。
如果您同时启动大量应用程序副本,则可以使用分辨率更高的计时器。但是,在值重复之前,您会冒更短时间段的风险。
好的,所以如果你真的认为你正在启动多个应用程序。
然后在计时器上使用更细的颗粒。
int main()
{
struct timeval time;
gettimeofday(&time,NULL);
// microsecond has 1 000 000
// Assuming you did not need quite that accuracy
// Also do not assume the system clock has that accuracy.
srand((time.tv_sec * 1000) + (time.tv_usec / 1000));
// The trouble here is that the seed will repeat every
// 24 days or so.
// If you use 100 (rather than 1000) the seed repeats every 248 days.
// Do not make the MISTAKE of using just the tv_usec
// This will mean your seed repeats every second.
}