如何生成一个好的随机种子传递给srand()?

时间:2010-02-02 14:26:58

标签: c++ c random

我正在编写一个C ++程序,需要为其内部用法创建一个临时文件。我想通过运行多个进程来允许并发执行程序,因此临时文件名需要随机化,这样每个衍生进程都会生成一个唯一的临时文件名供自己使用。

我使用rand()为部分文件名生成随机字符,所以我需要使用srand()初始化随机数生成器的种子。

有什么选择可以将一个好的参数传递给srand(),这样就不会使用相同的种子值初始化两个进程? 我的代码需要在Windows和Linux上运行。

7 个答案:

答案 0 :(得分:24)

问题是 实际上 询问如何创建一个唯一命名的临时文件。

操作系统可能为此提供了一个API,这意味着您不必生成自己的名称。

在Windows上,它名为GetTempFileName() and GetTempPath()

在Unix上,使用tmpfile()

(Windows也支持tmpfile();但是,我听到其他人的报告,虽然它在XP上工作得很好,但如果你使用的是C:驱动器并且你不是管理员;最好使用GetTempFileName()方法和自定义的安全路径

答案 1 :(得分:2)

如果您只是需要临时文件,可以使用:

FILE* tmpfile();        // Generate an unnamed temporary file.
char* tmpnam(char* s);  // Generate a file name in the director specified by TMPDIR

使用时间:

srand(time(NULL));

另请注意,rand()可能不是线程安全的 所以要小心你如何使用它。同时进入兰特的两个线程会引起问题。

答案 2 :(得分:1)

我自己从未使用过它,但您可以使用tmpnam()生成临时文件名。快速搜索表示对WindowsLinux的支持。

答案 3 :(得分:0)

你可以用微秒获得时间,并将它乘以一个大数来得到种子。但是,无论种子是什么,碰撞总会发生。

答案 4 :(得分:0)

在unix系统上,读取/dev/random

中的值

答案 5 :(得分:0)

不同的进程将具有不同的进程ID。然而,直接添加到时间会有点粗心,因为它通常是一个小数字。这不是一个大问题:潜在的问题是时间和进程ID都将其熵集中在最低位。通过简单地进行位反转并对结果进行异或,您可以获得所有位的良好熵。

答案 6 :(得分:0)

我建议您不要使用随机文件名,而是根据进程ID和当前时间创建一个唯一的文件名(如果您可以阅读的时间分辨率足以满足您的需要)。我对你的问题知之甚少,但我怀疑使用随机名称没有任何好处,并且碰撞的风险可能非常真实。即使您使用操作系统为另一个答案中建议的文件创建文件,也是如此。