标题几乎说明了这一点。
PS。这是针对 C++ Windows 程序的。
根据MSDN 文档srand()
(假设您使用的是 Microsoft 的 C 运行时库),种子是线程本地的,因此您需要srand()
为使用rand()
. 请注意,在其他实现中可能不是这种情况。
引用 MSDN:
srand 函数设置在当前线程中生成一系列伪随机整数的起点。
即使答案不是特定于平台的,我也建议您避免srand()
并<random>
改用。C++11 库不仅<random>
在多线程程序中提供了清晰的语义,而且还为随机数生成提供了更好的工具。它提供了几种不同的随机数生成器来满足不同的质量、速度和大小要求,以及许多标准分布,因此您不会犯人们在使用时经常犯的错误rand
。
不,根据标准,因为一旦调用srand()
它就会影响rand()
来自所有线程的调用。
C 库函数srand()
就像所有其他函数一样是单线程的,这意味着如果您从一个线程调用,它也会影响从其他线程srand()
生成的数字序列。rand()
但是微软提供了非标准的srand()
,它要求你从所有线程中调用它。
请注意,状态是纤维本地的(比线程本地更细粒度)。因此,必须为每根光纤调用 srand。(当然,当你不使用纤维时,它相当于线程本地。)