在 Windows 和 Linux 中以毫秒为单位的随机种子
Posted
技术标签:
【中文标题】在 Windows 和 Linux 中以毫秒为单位的随机种子【英文标题】:Seed random from milliseconds in Windows and Linux 【发布时间】:2010-09-05 08:43:27 【问题描述】:我需要在 boost 中为一些进程(从 int 加载)中的随机数生成器播种,用于必须在 Windows 和 Linux 中编译和工作的程序。
我使用了std:time(0)
,它有效,但由于这些进程是同时运行的作业,因此其中一些会同时运行,产生相同的结果。
所以我需要从毫秒或任何其他跨平台随机生成器开始播种。我尝试了clock()
,但无法将其从time_t
转换为int。
谢谢。
【问题讨论】:
即使以毫秒为精度,也可能有 2 个线程以相同的种子结束。 我希望这不是为了安全。 @Goz:Windows 通常精确到 32 毫秒... @Steven:基于时钟滴答的计时需要 10-16 毫秒,对于 QueryPerformanceCounter 来说非常随意——这可能更适合这个。在 PID 中进行异或运算,我会说。 @Tony:嗯,QueryPerformanceCounter
至少分辨率更高。我会坚持使用 CSP。
【参考方案1】:
您最好使用特定于平台的随机数源。在 Linux 上,使用 /dev/urandom
并读取几个字节。在 Windows 上,获取几个字节熵的简单方法是 UuidCreate
。
【讨论】:
Windows 等效的是使用 CSP,而不是生成 GUID。 没错,但是如果您没有高安全性需求,那么生成 UUID 比使用 CSP 更简单。请注意,默认情况下,Windows 不再生成顺序 UUID。 我同意 UUID 更简单,并且它是使用 PRNG 而不是简单序列生成的。但是,CSP 的 CryptGenRandom 函数与 urandom 等效,并且比 UUID 的更安全。 如何从程序 (C++) 中检查我在哪个平台上? @RS:通常我已经在预编译器指令中看到这样做以查找编译器版本,或者使用自定义#defines。如果您使用诸如 autotools 之类的工具进行构建,您可以使用它现有的工具来查看您是否有各种功能(配置)【参考方案2】:如果您从一个脚本启动所有作业。
然后你可以在命令行上传递一个递增的数字作为参数。然后每个 Job 将此值添加到 time() 的结果中以生成其种子。
注意:我在 OP 中没有看到任何关于安全性的要求。 原始代码使用 time(NULL),这将有一个可猜测的种子。
int main(int argc,char* argv[])
srand(time(NULL) + boost::lexical_cast<int>(argv[1]));
// STUFF
【讨论】:
以上是关于在 Windows 和 Linux 中以毫秒为单位的随机种子的主要内容,如果未能解决你的问题,请参考以下文章