【发布时间】:2013-12-23 02:39:58
【问题描述】:
我正在使用单个 Random 实例在 Parallel 查询中快速获取随机数,但我注意到,最终,Random.Next 总是返回零。有什么原因吗?
【问题讨论】:
-
随机不保证是线程安全的。
-
你是说它是随机的一段时间然后归零?
标签: c# random thread-safety
我正在使用单个 Random 实例在 Parallel 查询中快速获取随机数,但我注意到,最终,Random.Next 总是返回零。有什么原因吗?
【问题讨论】:
标签: c# random thread-safety
Random 不是线程安全的。相反,您应该为每个线程使用不同的 Random 实例。我不会建议您按照您的建议进行锁定,否则如果这是您总时间的重要部分,那么它最终可能不会比在单个线程中开始运行更快。相反,您可以使用线程局部变量为每个线程创建一个单独的实例——注意确保您不会意外地为所有实例使用相同的种子,这会在每个线程中为您提供相同的数字序列。
请参阅我的article on randomness 了解更多详细信息,包括示例代码。
【讨论】:
Random 实例,并将其用作每个线程本地随机数的种子。
Random 显然不喜欢同时在多个线程中使用。像这样锁定调用:
object syncLock = new object();
<snip>
int value;
lock(syncLock){
value = random.Next();
}
似乎已经解决了问题。
【讨论】: