srand() scope in C++



当您在函数内部调用srand()时,它是否只在该函数内部播种rand()

这里是调用srand()的函数main

int main(){
    srand(static_cast<unsigned int>(time(0)));
    random_number();
}
void random_number(){
    rand();
}

使用rand()的函数random_number在调用srand()的位置之外。

所以我的问题是——如果你用srand()来播种rand(),你能在调用srand()的地方之外使用播种的rand()吗?包括函数、不同的文件等。

srand在全球范围内有效,我们可以通过C99标准草案看到这一点,我们可以参考C标准,因为C++在C库函数方面回到了C标准,它说(emphasis mine):

srand函数使用参数作为新的伪随机序列的种子通过后续对rand的调用返回的数字。如果随后使用调用srand相同的种子值,应重复伪随机数序列。如果rand是在对srand进行任何调用之前调用,应生成相同的序列就像第一次使用种子值1调用srand时一样。

它并没有将其影响限制在它使用的范围内,它只是说它影响对rand的后续调用

标准草案中提供的可移植实现的例子更明确地表明,这种影响是全球性的:

static unsigned long int next = 1;
void srand(unsigned int seed)
{
   next = seed;
}

否,它适用于全局。它不限于函数,甚至不限于线程。

cplusplus.com有更多信息:http://www.cplusplus.com/reference/cstdlib/srand/

最新更新