为什么我需要在线程中使用 rand_r() 以及为什么每个线程需要不同的种子?

why I need to use rand_r() in threads and why I need different seed for each threads?

我不明白为什么我必须使用 rand_r() 在线程函数中生成随机数。还有为什么我需要为每个线程使用不同的种子。

why I need to use rand_r() in threads

来自 rand 的文档:函数 rand() 不是可重入的或线程安全的,...这可以使用可重入函数 rand_r( ).

why I need different seed for each threads?

你不一定需要,你可以选择在所有线程中使用或不使用相同的种子

Why I need different seed in each?

rand_r() 是一个伪随机数生成器。也就是说,它生成一个伪随机 序列 的数字:每次调用 return 序列中的下一个数字。

"Random" 意味着 "unpredictable." 如果你有一个真正随机的数字序列的生成器,你将无法预测序列中的下一个数字,无论前面的数字有多少你已经知道了。

随机”在某些方面类似于随机序列——可以用作好像 它在某些应用程序中是随机的——但它根本不是随机的。事实上,它是 100% 可预测的。要预测序列中的下一个数字,您只需要知道生成器的状态及其使用的算法。

伪随机生成器的 种子 提供了一种将生成器置于已知、可重复状态的方法。如果您为生成器的两个不同实例提供相同的种子,那么两个生成器将 return 完全相同的值序列。


想要每个线程获得与其他线程完全相同的序列吗?由你决定。如果那是您想要的,则为每个种子播种相同的值。如果您希望它们获得不同的 "random" 数字,则为每个生成器设置不同的值。

此外,如果您希望程序的不同 运行s 获得不同的 "random" 值,那么您必须分别使用不同的值作为种子节目时间 运行.