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

问题描述 投票:0回答:1

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

c multithreading thread-safety pthreads random-seed
1个回答
0
投票

为什么每个线程都需要使用不同的种子?

rand_r() rand_r()是一个伪随机数生成器。也就是说,它生成的是一个pseduo-random 顺序 的数字。每次调用都会返回序列中的下一个数字。

"随机 "的意思是 "不可预测"。如果你有一个真正随机的数字序列的生成器,你将无法预测序列中的下一个数字,无论你已经知道多少个前面的数字。

A " 随机 "是 喜欢 随机序列在某些方面可用于 仿佛 在某些应用中它是随机的--但它根本不是随机的。事实上,它是100%可预测的。要预测序列中的下一个数字,你只需要知道生成器的状态和它使用的算法。

这个 种子 为伪随机生成器提供了一种使生成器进入已知的、可重复的状态的方法。如果你向生成器的两个不同实例提供相同的种子,那么两个生成器将返回完全相同的值序列。


你是否 想要 每条线程都要得到与其他线程完全相同的顺序?这取决于你。如果这是你想要的,那么就给每个线程用相同的值做种子。如果你想让它们得到不同的 "随机 "数字,那就给每个生成器种上不同的值。

另外,如果你想要不同的 运行 的程序来获得不同的 "随机 "值,那么你必须在每次程序运行时使用不同的种子值。


0
投票

为什么我需要在线程中使用rand_r()?

从文件中可以看出 rand : 函数rand()不是重入式的,也不是线程安全的,......可以使用重入式函数rand_r()来实现。

为什么我需要为每个线程使用不同的种子?

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

© www.soinside.com 2019 - 2024. All rights reserved.