C++ srand() 函数

C++ srand() function

谁能解释一下 srand 的确切作用。我知道它与函数 rand 相关,并且输入 srand 函数的值是一个种子值,但是这个种子值究竟如何影响 rand 函数?

在使用特定参数 srand 之后,对 rand 的后续调用将产生完全相同的序列。所以你可以使用 srand 来允许用户,例如准确再现使用随机数的算法的结果。例如,在我的 C 上,

rand: 16807
rand: 282475249
rand: 1622650073

srand(3)
rand: 50421
rand: 847425747
rand: 572982925

srand(3)
rand: 50421
rand: 847425747
rand: 572982925

注意第二个序列和第三个序列是相同的。

如果你问的是种子与后面的随机数有什么确切的数值关系,一般是无关紧要的;如果你真的需要知道,你需要知道使用的确切伪随机数生成算法:不同的 C 编译器可以自由使用不同的算法,因为 C 语言规范中没有定义该算法。

这里是windows平台的工具:

static UINT32 next = 1;

int __cdecl rand(void)
{
    next = next * 1103515245 + 12345;
    /* return (unsigned int)(next / 65536) % 32768;*/
    return (UINT32)(next>>16) & RAND_MAX;
}

void __cdecl srand(unsigned int seed)
{
    /* And you *should* get a warning if sizes dont match
     */
    next = seed;
}

所以 srand 只需设置随机种子,使后续 rand 调用生成相同的输出。