c++中关于rand()函数的混淆

Confusion about rand() function in C++

本文关键字:函数 rand c++      更新时间:2023-10-16

我发现了以下情况的不同输出
案例1

....
rand();
cout<<a[rand()%4];
....

Case 2

....
//rand();
cout<<a[rand()%4];
......

如果没有srand(),答案应该是一样的,但结果却是不同的。

From http://en.cppreference.com/w/cpp/numeric/random/rand

std:: rand()为rand()使用的伪随机数生成器提供种子。如果在任何调用rand()之前使用rand(), rand()的行为就像用rand(1)作为种子一样。每次rand()使用rand()作为种子时,它必须在后续调用中产生相同的值序列。标准库中的其他函数也可以调用rand,但哪些函数调用rand是由实现定义的。rand()是否线程安全是由实现定义的。

这意味着rand()在case()中使用它设置的相同种子产生相同的数字序列。我认为情况是这样的,虽然一个调用rand()种子它与seed = 1,然后不设置种子为1在后续调用。因此,它将产生不同的结果。验证这一点的一种方法是再次显式地使用1作为种子。

每次调用rand都会给您一个新的伪随机数。调用srand只会改变您将得到的伪随机数字序列。