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 중국어 웹사이트의 기타 관련 기사를 참조하세요!