理解 C# 中的随机数生成并避免序列重复
本文解决了 C# 中的一个常见问题:Random
类的多个实例生成相同的随机数序列。 Random
类虽然设计用于生成看似不可预测的数字,但其内部算法依赖于种子值。 如果快速连续创建多个 Random
对象,它们通常会收到相似的种子值(通常基于系统时钟),从而产生相同的输出序列。
问题:多个 Random
实例
为每个需要随机数的对象创建一个新的 Random
实例是根本原因。 由于种子值非常接近,因此生成的序列几乎相同。
解决方案:单个共享Random
实例
解决方案很简单:创建一个 Random
实例并在所有需要随机数的对象之间共享它。 这确保每个对象都从相同的、不断演变的序列中绘制,从而防止重复问题。
以下是使用静态成员实现此功能的方法:
<code class="language-csharp">class A { private static readonly Random rnd = new Random(); // Static, read-only instance public void Count() { int r1 = rnd.Next(-1, 1); int r2 = rnd.Next(-1, 1); } } class B { List<A> listOfA = new List<A>(); public void DoSomething() { foreach (A aClass in listOfA) { aClass.Count(); } } }</code>
通过使用 static readonly
字段,我们确保单个 Random
实例创建一次并在类 A
的所有实例之间共享。这消除了重复种子值的风险,并保证每次调用rnd.Next()
都有唯一的随机数序列。 这种方法为每个 A
对象生成真正随机且不同的序列。
以上是为什么我的C#随机数生成器会在多个对象上产生相同的序列?的详细内容。更多信息请关注PHP中文网其他相关文章!