>백엔드 개발 >C++ >여러 Random.Next 인스턴스가 동일한 값을 반환하는 이유는 무엇입니까?

여러 Random.Next 인스턴스가 동일한 값을 반환하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-24 23:31:09888검색

Why Do Multiple Random.Next Instances Return Identical Values?

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

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