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