.NET中的随机和线程问题

thr*_*thr 5 .net c# collections multithreading data-structures

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

int randomLevel()
{
  int height = 1;

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

  return height;
}
Run Code Online (Sandbox Code Playgroud)

我的问题在于,有时候我连续几千个元素只能从这里获得一次,这会杀死跳过列表的性能.10.000个元素连续生成这个方法只有1个的机会,看起来非常渺茫(非常一致).

所以我假设(猜测)Random对象在某种程度上存在问题,但我真的不知道从哪里开始挖掘.所以我转向stackoverflow看看是否有人有想法?

编辑

rnd-variable在类中声明SkipList<T>,并且可以从多个线程访问(每个线程调用集合上的.Add和Add调用.randomLevel)

Ada*_*son 4

尝试lock使用该Random对象。

int RandomLevel()
{
    int height = 1;

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

    return height;
}
Run Code Online (Sandbox Code Playgroud)

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