我使用单个Random实例在Parallel
查询中快速获取随机数,但我注意到,Random.Next
总是返回零。这有什么理由吗?
答案 0 :(得分:17)
Random
不是线程安全的。您应该为每个线程使用不同的Random
实例。我不会按照你的建议建议锁定,否则如果这是你总体时间的重要部分,那么它最终可能不会比在单个线程中运行它更快。相反,您可以使用线程局部变量为每个线程创建一个单独的实例 - 注意确保不会意外地为所有实例使用相同的种子,这会在每个线程中为您提供相同的数字序列。
有关详细信息,请参阅我的article on randomness,包括示例代码。
答案 1 :(得分:1)
Random
显然不喜欢同时在多个线程中使用。像这样锁定呼叫:
object syncLock = new object();
<snip>
int value;
lock(syncLock){
value = random.Next();
}
似乎解决了这个问题。