c# - .NET 中的随机和线程问题

标签 c# .net multithreading data-structures collections

我在使用 Random 时遇到了问题在 .NET 类中,我正在实现一个工作正常的线程集合,除了一个较小的细节。该系列是一个 Skip list熟悉它的人都知道,对于插入的每个节点,我都需要生成一个新高度,即 <= CurrentMaxHeight+1 ,这是我用来执行此操作的代码(我知道它效率很低,但它可以工作,这是我现在的主要优先事项)

int randomLevel()
{
  int height = 1;

  while(rnd.NextDouble() >= 0.5 && height < MaxHeight)
    ++height;

  return height;
}

我的问题是,有时我连续几千个元素只能从中返回 1,这会破坏跳过列表的性能。 10.000 个元素连续通过此方法仅生成 1 个的机会似乎非常渺茫(发生得相当一致)。

所以我假设(猜测) Random 有问题以某种方式反对,但我真的不知道从哪里开始挖掘。所以我转向stackoverflow看看有没有人有想法?

编辑

rnd 变量在类 SkipList<T> 中声明, 并从多个线程访问它(每个线程在集合上调用 .Add 并调用 .randomLevel)

最佳答案

尝试锁定 Random 对象。

int RandomLevel()
{
    int height = 1;

    lock(rnd)
    {
        while(rnd.NextDouble >= 0.5 && height < MaxHeight) height++;
    }

    return height;
}

当多个线程同时访问 Random 对象时,可能会出现冲突问题,并且种子可能会损坏。我无法对具体可能发生的事情提供任何见解,但根据 MSDNRandom 类型的实例成员不能保证是线程安全的,因此在任何情况下似乎都需要一个lock

关于c# - .NET 中的随机和线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1532046/

相关文章:

c# - 直接在 XAML 中使用 .resw 文件中的字符串

c# - XAML 和 WPF - 将变量传递给 XAML Windows

c# - 单元测试中的依赖注入(inject),xUnit

c++ - 带有 std::thread 和 std::chrono 的基本计时器

C# MVC 4 : Create Word Document and download without saving in disk

c# - 如何使用存储在列表中的对象(用于排序目的)C#

c# - .Net 框架中是否有可用于表示 AnsiString 的内置类?

c# - 维护排序顺序的集合 C#

java - java中的事件是在单独的线程中处理还是我必须自己做?

Java Hibernate 多线程