我正在使用.NET创建一个人工生命程序,并且我正在使用C#中定义的伪随机类来实现单例。这个想法是,如果我在整个应用程序中使用相同的随机数生成器,我只需保存种子,然后从种子重新加载以重新计算某个有趣的运行。
public sealed class RandomNumberGenerator : Random
{
private static readonly RandomNumberGenerator instance = new RandomNumberGenerator();
RandomNumberGenerator()
{
}
public static RandomNumberGenerator Instance
{
get
{
return instance;
}
}
}
我希望能有一个方法可以给我两个不同的随机数。
public static Tuple<int, int> 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<int, int>(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<int, int>(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;
}
}
}
[ThreadStatic]
- 从未听说过这个。 - Jonathon Reinhart