非线程安全会增加Multiply-with-Carry伪随机数生成器的随机性吗?

时间:2012-08-23 21:08:58

标签: c algorithm random

我正在阅读this section,最后一段说明示例代码不是线程安全的。我的问题是:这不会有助于增加其随机性(即如果多个线程同时执行这些行)?

4 个答案:

答案 0 :(得分:7)

PRNG经过精心设计(好吧,可能不是RANDU),可以产生可预测且随机分布的结果。它们不必是真正随机的,它们只需要满足统计质量测试,产生足够大的时间并且对同一种子具有确定性。

如果您碰巧同时使用来自多个线程的发电机,那么所有这些保证就会耗尽。最重要的是,您无法获得可重复的结果(这在模拟中非常重要)。然后状态可能会改变,或者你可能在不同的线程中得到两次相同的数字,那些东西。

你绝对不想去那里。每个线程创建一个PRNG(最好使用线性独立的种子)。

答案 1 :(得分:4)

非线程安全随机数生成器的一个可能的副作用是您可以以某种方式破坏内部状态。例如,如果您从两个不同的线程访问.NET的Random的相同实例,则可以将其置于仅重复返回0的状态。

在您链接的RNG中,看起来不会发生特定问题,但是某些退化并发访问模式可能会将m_zm_w设置为0,这取决于评论也不错。

答案 2 :(得分:0)

你绝对可以从线程时序生成中获得熵,但是以前者可能干扰后者的可证明属性的方式混合熵收集和伪随机数生成是一个非常糟糕的主意 - 就像Joey一样说过。我添加新答案的原因是您可以考虑将实际熵与PRNG混合(或者作为种子,或者定期引入更多),并且从不同线程收集实时定时信息是熵的一种可能来源。然而,它应该严格地完成(使用适当的锁定或无锁定的原子操作来存储结果),而不是通过调用未定义的行为并希望能让你获得熵。

答案 3 :(得分:0)

有许多方法可以使代码非线程安全。

一种方法是线程无法看到其他线程对内存的写入。

我们可能会发现随机数生成所有零,因为它永远不会“看到”其他线程完成的工作。