假设srand()+ rand()的随机性足以满足您的目的,诀窍是为srand选择最佳种子。time(NULL)是一个很好的起点,但是如果在同一秒内启动多个程序实例,则会遇到问题。添加pid(进程ID)是一项改进,因为不同的实例将获得不同的pid。我会将pid乘以一个因子,以将其扩展更多。
但是,假设您将其用于某些嵌入式设备,并且在同一网络中有多个设备。如果它们都立即通电,并且您在引导时自动启动程序的多个实例,则它们可能仍会获得相同的时间和pid,并且所有设备将生成相同的“随机”数字序列。在这种情况下,您可能需要为每个设备添加一些唯一标识符(例如CPU序列号)。
建议的初始化将是:
srand(time(NULL) + 1000 * getpid() + (uint) getCpuSerialNumber());
在Linux机器上(至少在我测试过的Raspberry Pi中),可以实现以下功能来获取CPU序列号:
uint64_t getCpuSerialNumber() {
FILE *f = fopen("/proc/cpuinfo", "r");
if (!f) {
return 0;
}
char line[256];
uint64_t serial = 0;
while (fgets(line, 256, f)) {
if (strncmp(line, "Serial", 6) == 0) {
serial = strtoull(strchr(line, ':') + 2, NULL, 16);
}
}
fclose(f);
return serial;
}