13

标题几乎说明了这一点。

PS。这是针对 C++ Windows 程序的。

4

4 回答 4

16

根据MSDN 文档srand() (假设您使用的是 Microsoft 的 C 运行时库),种子是线程本地的,因此您需要srand()为使用rand(). 请注意,在其他实现中可能不是这种情况。

引用 MSDN:

srand 函数设置在当前线程中生成一系列伪随机整数的起点。

于 2012-04-15T05:17:06.833 回答
5

即使答案不是特定于平台的,我也建议您避免srand()<random>改用。C++11 库不仅<random>在多线程程序中提供了清晰的语义,而且还为随机数生成提供了更好的工具。它提供了几种不同的随机数生成器来满足不同的质量、速度和大小要求,以及许多标准分布,因此您不会犯人们在使用时经常犯的错误rand

于 2012-04-15T05:43:01.170 回答
2

不,根据标准,因为一旦调用srand()它就会影响rand()来自所有线程的调用。

C 库函数srand()就像所有其他函数一样是单线程的,这意味着如果您从一个线程调用,它也会影响从其他线程srand()生成的数字序列。rand()

但是微软提供了非标准的srand()要求你从所有线程中调用它。

于 2012-04-15T05:16:28.183 回答
0

请注意,状态是纤维本地的(比线程本地更细粒度)。因此,必须为每根光纤调用 srand。(当然,当你不使用纤维时,它相当于线程本地。)

于 2018-06-11T12:51:35.250 回答