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
调用生成相同的输出。
谁能解释一下 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
调用生成相同的输出。