在 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 中以毫秒为单位的随机种子的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中以毫秒为单位获取当前时间?

为啥 setDate() 在 nodejs 中以毫秒为单位给出最终日期? [复制]

如何在 Ruby 中以毫秒为单位计时?

想要在存储过程中以毫秒为单位获取两个时间戳的差异

如何在 c++ 中以毫秒为单位获得系统启动时间?

MySql 中以毫秒为单位的 AVG 时间