在Windows和Linux中使用毫秒数种子生成随机数

3
我需要在boost中种子随机数生成器(从int加载),用于一些进程,因为程序必须在Windows和Linux中编译和工作。
我使用了std::time(0),它起作用了,但是由于这些进程是同时运行的作业,其中一些会在同一秒钟运行,产生相同的结果。
因此,我需要从毫秒或任何其他跨平台的随机生成器中进行种子处理。我尝试了clock(),但无法将其从time_t转换为int。
谢谢。

即使以毫秒精度计算,两个线程最终使用相同的种子是很有可能的。 - Goz
我希望这不是打算要保密的。 - Steven Sudit
@Goz:而Windows通常精确到约32毫秒... - Steven Sudit
@Steven:基于时钟滴答的计时大约需要10-16毫秒,而QueryPerformanceCounter则更加随意,也许更适合这种情况。在PID中进行异或操作,我想这样做应该可以。 - Tony Delroy
@Tony:嗯,QueryPerformanceCounter 的分辨率更高,至少如此。我会坚持使用CSP。 - Steven Sudit
2个回答

3

最好使用特定于平台的随机数源。在Linux上,使用/dev/urandom并读取几个字节。在Windows上,获取一些熵的简单方法是使用UuidCreate


Windows的等效方法是使用CSP,而不是生成GUID。 - Steven Sudit
如果您没有高安全需求,那么生成UUID比使用CSP更简单。请注意,Windows默认不再生成顺序UUID。 - Greg Hewgill
我同意UUID更简单,并且是使用PRNG而不是简单序列生成的。然而,CSP的CryptGenRandom函数仍然比UUID更安全,因为它相当于urandom。 - Steven Sudit
我该如何在程序(C++)中检查我所在的平台? - R S
@R S:通常我看到这是通过预编译指令来查找编译器版本或使用自定义 #define 来完成的。如果你正在使用类似 autotools 的工具进行构建,你可以使用其现有的功能来查看是否有各种函数(configure)。 - Merlyn Morgan-Graham
@RS:如果你在Windows上使用Visual C++,或者其他Windows编译器,你可以在你的Windows代码周围使用#ifdef _WIN32 / #else / #endif。 - Tony Delroy

0
如果您正在从单个脚本启动所有作业。
那么您可以在命令行上传递一个递增的数字作为参数。每个作业然后将此值添加到time()的结果中以生成其种子。
注意:我在OP中没有看到任何关于安全性的要求。 原始代码使用time(NULL),这将具有可猜测的种子。
int main(int argc,char* argv[])
{
    srand(time(NULL) + boost::lexical_cast<int>(argv[1]));

    // STUFF
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接