>백엔드 개발 >C++ >내 C# 난수 생성기가 여러 개체에 걸쳐 동일한 시퀀스를 생성하는 이유는 무엇입니까?

내 C# 난수 생성기가 여러 개체에 걸쳐 동일한 시퀀스를 생성하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-24 23:26:09330검색

Why Does My C# Random Number Generator Produce the Same Sequence Across Multiple Objects?

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.