개발/기본) 기본기

기본기) Seed Random 구현 방식(고정랜덤)

테샤르 2021. 3. 8. 23:54

Seed Random 구현 방식(고정 랜덤)

Random이라는 난수를 발생시키는 과정에서 늘 항상 고정으로 특정 처리를 하고 싶은 경우에 사용한다.

실제 난수발생기 로직으로  볼 수 없고  '선형 합동 생성기'라고 한다. 

 

특정 시드를 기준으로 늘 항상 같은 List를 값을 반환해주는 코드이다.

public class SeedRandom 
{

    private int seed;
    private List<int> m_listShuffleData = new List<int>();

    public SeedRandom(int nSeed, int _totalCount)
    {
        seed = nSeed;
        ShuffleIntList(_totalCount);
    }

    #region Private Method
    private float Random()
    {
        seed++;
        return (float)((seed * 9301 + 49297) % 233280 / 233280.0f);
    }

    private int RandomRange(int min, int max)
    {
        float rand = this.Random();
        int number = (int)Mathf.Floor((rand * (max - min + 1)) + min);
        return number;
    }

    private void ShuffleIntList(int _max)
    {
        List<int> dataOrigin = new List<int>();
        for (int i = 0; i < _max; i++)
        {
            dataOrigin.Add(i);
        }

        while (0 < dataOrigin.Count)
        {
            int idx = RandomRange(0, dataOrigin.Count - 1);
            int num = dataOrigin[idx];
            m_listShuffleData.Add(num);

            dataOrigin.Remove(num);
        }
    }

    #endregion

    #region Public Method
    public List<int> Data
    {
        get { return m_listShuffleData; }
    }

    #endregion
}

 

실제 이런 식의 코드 로직에 대한 설명

 

(seed * 9301 + 49297) % 233280 / 233280.0 난수를 생성하는 이유는 무엇입니까?

그렇지 않습니다. 완전히 결정적인 숫자를 생성합니다. 결과 시퀀스는 언뜻 보기에 무작위로 보일 수 있으므로 의사 랜덤 생성기입니다. 보다 정확하게는 선형 합동 생성기입니다.

 

참고 StackOverFlow : [링크]

 

Why does "(seed * 9301 + 49297) % 233280 / 233280.0" generate a random number?

// Found this seed-based random generator somewhere // Based on The Central Randomizer 1.3 (C) 1997 by Paul Houle (houle@msc.cornell.edu) var seed = 1; /** * return a random number based o...

stackoverflow.com

 

★☆

 

반응형