【发布时间】:2012-04-15 05:12:20
【问题描述】:
标题几乎说明了这一点。
PS。这是针对 C++ Windows 程序的。
【问题讨论】:
-
请出示您的代码...
标签: c++ windows random random-seed
标题几乎说明了这一点。
PS。这是针对 C++ Windows 程序的。
【问题讨论】:
标签: c++ windows random random-seed
根据the MSDN documentation on srand()(假设您使用的是Microsoft 的C 运行时库),种子是线程本地的,因此您需要为每个使用rand() 的线程调用srand()。请注意,在其他实现中可能并非如此。
引用自 MSDN:
srand 函数设置在当前线程中生成一系列伪随机整数的起点。
【讨论】:
srand() 或 rand() 是线程安全的。
rand()的重点是它从一个种子开始生成一个固定的序列。当来自其他线程的调用可以修改调用线程获取的序列时,很难看出这有什么用。 (当然,这是一个公平的论点,即使这是一个修复,它也是一个地雷,因为该函数具有相同的名称但不同的语义。)
即使答案不是特定于平台的,我也建议您避免使用srand() 并改用<random>。 C++11 <random> 库不仅在多线程程序中提供了清晰的语义,而且还为随机数生成提供了更好的工具。它提供了几种不同的随机数生成器来满足不同的质量、速度和大小要求,以及许多标准分布,因此您不会犯人们在使用rand 时经常犯的错误。
【讨论】:
不,根据标准,因为一旦您调用 srand(),它会影响来自所有线程的 rand() 调用。
C 库函数srand() 与所有其他函数一样是单线程的,这意味着如果您从一个线程调用srand(),它也会影响其他线程中从rand() 生成的数字序列。
但微软提供了非标准的srand(),确实要求你从所有线程中调用它。
【讨论】:
No。
srand。 (我不能 100% 确定符合 C++11 的要求,但我相信确实如此。)
请注意,状态是光纤本地的(比线程本地更细粒度)。因此,必须为每根光纤调用 srand。 (当然,当你不使用 Fiber 时,它相当于 thread-local。)
【讨论】: