【问题标题】:Seed random from milliseconds in Windows and Linux在 Windows 和 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。

标签: c++ windows linux random


【解决方案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
}

【讨论】:

    猜你喜欢
    • 2014-09-19
    • 2023-02-08
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多