几乎每个 C/C++(Mersenne,...)中的伪随机生成器都使用某种内部状态,通常是一个短的字节向量。我的问题是,当在多线程环境中使用和共享这样的随机生成器时,让它线程安全“更好”还是让“竞争条件”发生只会增加随机性?
我知道这个问题很难严格回答,但会感谢任何意见。
让“竞争条件”发生可能会搞砸一切。从技术上讲,数据竞赛是未定义的行为,因此它可以订购披萨。
但即使这没有发生,内部状态也可能会被破坏,随机序列的所有重要属性都将丢失。例如,您无法再保证一致性。您不能将随机数的生成留给机会。
让竞争条件发生永远不会更好。您的代码可能会崩溃。即使没有,这几乎肯定会降低生成的数字的质量。人们花费大量精力来设计随机数生成器,并且注入这种噪音很可能会破坏他们的努力。
这在很大程度上取决于内部状态的种类。如果每个可能的位模式都是内部状态的有效表示,因此会在随机数序列的某个点发生,那么写入竞争应该没有问题。但是许多随机数生成器,包括您引用的 Mersenne,其周期不是 256 的幂,因此具有一些在单线程操作中永远无法达到的状态模式,并且可能会在多线程操作中导致问题。
但是还有一个更好的理由使 rng 线程安全:否则两个进程可能会在任何一个更新之前读取相同的状态。这可能导致两个进程共享完全相同的随机数,这可能会导致各种奇怪的问题,具体取决于您的应用程序。您可以使用互斥锁或线程本地状态使其成为线程安全。