Random.Next()始终返回0

时间:2013-12-05 22:30:02

标签: c# random thread-safety

我使用单个Random实例在Parallel查询中快速获取随机数,但我注意到,Random.Next总是返回零。这有什么理由吗?

2 个答案:

答案 0 :(得分:17)

Random不是线程安全的。您应该为每个线程使用不同的Random实例。我不会按照你的建议建议锁定,否则如果这是你总体时间的重要部分,那么它最终可能不会比在单个线程中运行它更快。相反,您可以使用线程局部变量为每个线程创建一个单独的实例 - 注意确保不会意外地为所有实例使用相同的种子,这会在每个线程中为您提供相同的数字序列。

有关详细信息,请参阅我的article on randomness,包括示例代码。

答案 1 :(得分:1)

Random显然不喜欢同时在多个线程中使用。像这样锁定呼叫:

object syncLock = new object();
<snip>
int value;
lock(syncLock){
    value = random.Next();
}

似乎解决了这个问题。