본문 바로가기
Utils

C#, 중복되지 않게 랜덤 숫자 생성

by Client. DJ 2022. 8. 22.
반응형

중복되지 않은 난수 배열 필요

랜덤으로 난수를 생성하되, 중복되지 않게 생성하고 싶은 경우가 생겨서 작성하게되었습니다. 아래의 스크립트를 통해 난수 배열을 가져올 수 있습니다.

스크립트

    /// <summary>
    /// 중복되지 않는 랜덤 숫자 리스트 만들기 (minValue: 0)
    /// </summary>
    /// <param name="maxValue">최대값(제외)</param>
    /// <param name="count">반환 개수</param>
    /// <param name="isDuplicate">중복 숫자 여부</param>
    /// <param name="randomSeed">랜덤 씨드</param>
    /// <returns></returns>
    public static int[] MakeRandomNumbers(int maxValue, int randomSeed = 0)
    {
        return MakeRandomNumbers(0, maxValue, randomSeed);
    }

    /// <summary>
    /// 중복되지 않는 랜덤 숫자 리스트 만들기
    /// </summary>
    /// <param name="minValue">최소값(포함)</param>
    /// <param name="maxValue">최대값(제외)</param>
    /// <param name="count">반환 개수</param>
    /// <param name="isDuplicate">중복 숫자 여부</param>
    /// <param name="randomSeed">랜덤 씨드</param>
    /// <returns></returns>
    public static int[] MakeRandomNumbers(int minValue, int maxValue, int randomSeed = 0)
    {
        if (randomSeed == 0)
            randomSeed = (int)DateTime.Now.Ticks;

        List<int> values = new List<int>();
        for (int v = minValue; v < maxValue; v++)
        {
            values.Add(v);
        }

        int[] result = new int[maxValue - minValue];
        System.Random random = new System.Random(Seed: randomSeed);
        int i = 0;
        while (values.Count > 0)
        {
            int randomValue = values[random.Next(0, values.Count)];
            result[i++] = randomValue;

            if (!values.Remove(randomValue))
            {
                // Exception
                break;
            }
        }

        return result;
    }

예제

private static void Main(params string[] args)
{
    // 0 ~ 10 랜덤 난수 배열 만들기
    int[] randomNumbers = Utils.MakeRandomNumbers(10);
    for (int i = 0; i < randomNumbers.Length; i++)
    {
        Console.WriteLine(randomNumbers[i]);
    }
    
    // Result
    // 9
    // 5
    // 4
    // 2
    // 8
    // ..
}

마무리

매개변수로 중복을 허용할 수도 있으며, 랜덤 시드를 설정하여 랜덤을 고정할 수 있습니다.

필요한 경우 유용하게 사용하시길 바랍니다. :)

반응형

댓글