我在使用 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
对象时,可能会出现冲突问题,并且种子可能会损坏。我无法对具体可能发生的事情提供任何见解,但根据 MSDN ,Random
类型的实例成员不能保证是线程安全的,因此在任何情况下似乎都需要一个lock
。
关于c# - .NET 中的随机和线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1532046/