C#随机数生成器卡在一个循环中

我正在使用.NET创建一个人工生命程序,我正在使用C#在Singleton中定义的伪随机类。 我的想法是,如果我在整个应用程序中使用相同的随机数生成器,我只能保存种子,然后从种子重新加载以重新计算某个有趣的运行。

public sealed class RandomNumberGenerator : Random { private static readonly RandomNumberGenerator instance = new RandomNumberGenerator(); RandomNumberGenerator() { } public static RandomNumberGenerator Instance { get { return instance; } } } 

我还想要一个可以给我两个不同随机数的方法。

 public static Tuple TwoDifferentRandomNumbers(this Random rnd, int minValue, int maxValue) { if (minValue >= maxValue) throw new ArgumentOutOfRangeException("maxValue", "maxValue must be greater than minValue"); if (minValue + 1 == maxValue) return Tuple.Create(minValue, maxValue); int rnd1 = rnd.Next(minValue, maxValue); int rnd2 = rnd.Next(minValue, maxValue); while (rnd1 == rnd2) { rnd2 = rnd.Next(minValue, maxValue); } return Tuple.Create(rnd1, rnd2); } 

问题是有时rnd.Next(minValue,maxValue总是返回minValue 。如果我此时断点并尝试创建一个double并将其设置为rnd.NextDouble() ,它返回0.0。任何人都知道为什么会发生这种情况?

我知道它是一个伪随机数生成器,但坦率地说,我没想到它会锁定为0.从多个线程访问随机数生成器……这可能是问题的根源吗?

编辑:谢谢,问题最终是线程安全。

这是该类的新版本。

  public sealed class RandomNumberGenerator : Random { private static Random _global = new Random(); [ThreadStatic] private static Random _localInstance; RandomNumberGenerator() { } public static Random Instance { get { Random inst = _localInstance; if (inst == null) { int seed; lock (_global) seed = _global.Next(); _localInstance = inst = new Random(seed); } return _localInstance; } } } 

如果即使保存种子也只使用一个RNG用于多个线程,则下次启动应用程序时将无法生成相同的数字,因为您无法确定从不同的RNG调用RNG线程的顺序相同。

如果你有一个固定/已知的线程数,每个线程产生一个RNG并保存每个种子。

如果你100%确定每个线程将使用与上一次完全相同的顺序调用RNG(如果你使用相同的种子),请忘记我刚刚说的话。

Random类不是线程安全的。

您应该创建static实例[ThreadStatic] ,或使用锁保护它。

我的想法是,如果我在整个应用程序中使用相同的随机数生成器,我只能保存种子,然后从种子重新加载以重新计算某个有趣的运行。

实际上,您并不需要RNG的单例实例。 如果将两个独立的Random实例初始化为同一个seed ,它们将生成完全相同的序列。

我的建议是,除了种子,但摆脱单身人士。

我甚至不必查阅Random类,知道“此类的所有实例方法或不是线程安全的”。 这适用于所有.NET类,只有极少数例外。

是的,它是multithreading的。 但是你没有提到validationMaxValue> MinValue。