有人能解释一下srand
到底做了什么吗。我知道它与函数rand有关,而输入到srand
函数中的值是种子值,但是这个种子值到底如何影响rand
函数呢?
发布于 2016-05-20 02:32:57
在具有特定参数的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语言规范中定义。
发布于 2016-05-20 03:32:30
下面是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
调用生成相同的输出。
https://stackoverflow.com/questions/37337006
复制相似问题