我在Parallel
查询中使用单个Random实例来快速获取随机数,但是我注意到,最终Random.Next
总是返回零。这是有原因的吗?
我在Parallel
查询中使用单个Random实例来快速获取随机数,但是我注意到,最终Random.Next
总是返回零。这是有原因的吗?
Random
不是线程安全的。应该为每个线程使用不同的Random
实例。我不建议像你建议的那样进行锁定,因为如果这是你总体时间的重要部分,最终可能会变得比一开始在单个线程中运行还要慢。相反,您可以使用线程本地变量来为每个线程拥有独立的实例 - 注意确保不会意外地为所有实例使用相同的种子,否则每个线程将得到相同的数字序列。
有关更多详细信息,包括示例代码,请参见我的随机性文章。
Random
实例,该实例受锁保护,并将其用于每个线程本地随机数的种子。 - Jon SkeetRandom
显然不喜欢同时在多个线程中使用。像这样在调用周围放置锁:
object syncLock = new object();
<snip>
int value;
lock(syncLock){
value = random.Next();
}
看起来已经解决了这个问题。