Random.Next() 总是返回 0

5

我在Parallel查询中使用单个Random实例来快速获取随机数,但是我注意到,最终Random.Next总是返回零。这是有原因的吗?


4
随机数生成器并不保证是线程安全的。 - user2864740
2
以线程安全的方式获取随机数 - Tim Schmelter
你是说它会随机一段时间,然后最终稳定在零吗? - Austin Salonen
2个回答

21

Random不是线程安全的。应该为每个线程使用不同的Random实例。我不建议像你建议的那样进行锁定,因为如果这是你总体时间的重要部分,最终可能会变得比一开始在单个线程中运行还要慢。相反,您可以使用线程本地变量来为每个线程拥有独立的实例 - 注意确保不会意外地为所有实例使用相同的种子,否则每个线程将得到相同的数字序列。

有关更多详细信息,包括示例代码,请参见我的随机性文章


Jon,链接中的文章很好。你考虑过使用ThreadId来进一步增加种子值的分离吗? - Corey
@Corey:我希望连续的种子对随机数序列没有明显的影响。另一种选择是使用单个“主”Random实例,该实例受锁保护,并将其用于每个线程本地随机数的种子。 - Jon Skeet
我想我只是喜欢尽可能多地向我的种子添加熵。这可能有点傻,但是连续的种子值让我感到不安:P - Corey

0

Random 显然不喜欢同时在多个线程中使用。像这样在调用周围放置锁:

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

看起来已经解决了这个问题。


1
这让人感觉到“巧合编程”。 - Austin Salonen
@AustinSalonen 我建议你添加该文章的链接,看起来很有趣。 - BrainStorm.exe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接