理解 C# 中的相同随机数生成
当使用类的多个实例在循环中生成随机数时,您可能会观察到 Random.Next()
重复生成相同的值。此行为源于 Random
类的函数方式。
Random
类依赖种子值来启动其伪随机数序列。 如果快速连续创建多个 Random
实例,它们通常会收到非常相似的种子值,从而产生相同的输出序列。
解决方案:共享随机实例
为了克服这个问题,不要为每个类对象创建一个新的 Random
实例,而是创建一个 Random
实例并在类的所有实例之间共享它。 这确保每个实例都从相同的、不断演变的随机数序列中抽取。
这是演示此方法的改进示例:
<code class="language-csharp">public class A { private readonly Random _rnd; public A(Random rnd) { _rnd = rnd; } public void Count() { int r1 = _rnd.Next(-1, 1); // Note: Next(-1, 1) will only return -1 or 0. To get -1, 0, or 1, use Next(-1, 2) int r2 = _rnd.Next(-1, 2); // Corrected to include 1 } } public class B { private readonly List<A> _listOfA = new List<A>(); private readonly Random _rnd = new Random(); public B() { // Populate _listOfA... (Example below) for (int i = 0; i < 10; i++) { _listOfA.Add(new A(_rnd)); } } public void Process() { foreach (var aClass in _listOfA) { aClass.Count(); } } }</code>
通过将共享的 _rnd
实例注入到 A
类构造函数中,每个 A
实例都使用相同的随机数生成器,保证所有实例中的随机数不同。 请注意 Next(-1,2)
中的更正,以在可能的输出中包含 1。
以上是为什么多个 Random.Next 实例返回相同的值?的详细内容。更多信息请关注PHP中文网其他相关文章!