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
인스턴스가 동일한 난수 생성기를 사용하여 모든 인스턴스에서 고유한 난수를 보장합니다. 가능한 출력에 1을 포함하도록 Next(-1,2)
의 수정 사항에 유의하세요.
위 내용은 여러 Random.Next 인스턴스가 동일한 값을 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!