【问题标题】:Random.Next() always returns 0 [duplicate]Random.Next() 总是返回 0 [重复]
【发布时间】:2013-12-23 02:39:58
【问题描述】:

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

【问题讨论】:

标签: c# random thread-safety


【解决方案1】:

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

请参阅我的article on randomness 了解更多详细信息,包括示例代码。

【讨论】:

  • 链接乔恩的好文章。您是否考虑过使用 ThreadId 进一步增加种子值的分离度?
  • @Corey:我希望连续的种子对随机数的序列没有任何明显的影响。另一种方法是拥有一个锁保护的“主”Random 实例,并将其用作每个线程本地随机数的种子。
  • 我想我只是想给我的种子添加尽可能多的熵。这可能很愚蠢,但是关于顺序种子值的一些事情让我感到不安:P
【解决方案2】:

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

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

似乎已经解决了问题。

【讨论】:

  • 这有点巧合编码的味道。
  • @AustinSalonen 我建议您添加该文章的链接,它看起来很有趣。
猜你喜欢
  • 2013-04-17
  • 2010-12-11
  • 2011-07-12
  • 2012-02-12
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多