C#随机数生成器被陷在一个周期

我使用.NET创建一个人工生命的程序,我用一个Singleton定义的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如果我断点在这一点上,并尝试建立一个双并将其设置为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和保存每个种子。

忘了我刚才说的,如果你是100%肯定,如果你使用相同的种子每一个线程调用RNG具有完全相同的顺序为最后一次。

Random类不是线程安全的。

你应该让你的static实例[ThreadStatic]或用锁保护它。

我们的想法是,如果使用相同的随机数发生器在整个应用程序,我可以仅仅保存种子,然后从种子重装重新计算一定有趣运行。

你实际上并不需要的RNG此的单一实例。 如果初始化两个分开的实例Random到相同的seed ,它们将产生相同的序列。

我的建议是,保存种子,但摆脱单身的。

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

所以,是的,它是多线程。 但你有没有提到验证的MaxValue> MINVALUE无论是。

分类:C# 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.940 (s). 10 q(s)