언어/C#

[C#] 랜덤 배열(리스트) 셔플하기 (Fisher-Yates 알고리즘)

달시_Dalsi 2025. 1. 9. 00:52
728x90

랜덤 배열 셔플은 게임 개발, 데이터 샘플링 등 무작위화가 필요한 여러 상황에서  유용하게 사용됩니다.
이번 글에서는
C#에서 배열과 리스트를 무작위로 섞는 방법을 다루고, 이를 구현하는 데 가장 널리 알려진 Fisher-Yates Shuffle 알고리즘를 소개합니다ㅏ.

 

배열과 리스트의 무작위화 필요성

배열이나 리스트를 무작위로 섞는 기능은 게임에서 특히 자주 사용됩니다. 

  • 카드 게임: 덱을 무작위로 섞기.
  • 적 스폰: 특정 패턴 없이 랜덤한 위치에 적을 배치.
  • 퀴즈: 문제나 보기의 순서를 무작위로 섞기.

 

Fisher-Yates Shuffle 알고리즘이란?

Fisher-Yates Shuffle 알고리즘은 배열이나 리스트의 요소를 무작위로 섞는 효율적인 방법입니다.

작동 원리는 입니다.

  1. 배열의 마지막 요소부터 시작하여, 현재 요소와 랜덤한 이전 요소를 교환합니다.
  2. 이를 배열의 첫 번째 요소까지 반복합니다.

 

Fisher-Yates Shuffle의 C# 구현

배열 셔플 코드

public static T[] FisherYatesShuffle<T>(T[] array)
{
    System.Random random = new System.Random();

    for (int i = array.Length - 1; i > 0; i--)
    {
        // i까지의 범위에서 무작위 인덱스를 선택
        int j = random.Next(0, i + 1);

        // 현재 요소와 무작위 요소를 교환
        T temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    return array;
}

 

 

 

리스트 셔플 코드

public static List<T> FisherYatesShuffle<T>(List<T> list)
{
    System.Random random = new System.Random();

    for (int i = list.Count - 1; i > 0; i--)
    {
        int j = random.Next(0, i + 1);

        // Swap elements
        T temp = list[i];
        list[i] = list[j];
        list[j] = temp;
    }

    return list;
}

 

사용 예제

배열 셔플

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
numbers = FisherYatesShuffle(numbers);

foreach (var number in numbers)
{
    Console.WriteLine(number);
}

 

 

리스트 셔플

List<string> cards = new List<string> { "Ace", "King", "Queen", "Jack", "10" };
cards = FisherYatesShuffle(cards);

foreach (var card in cards)
{
    Console.WriteLine(card);
}

 

Unity에서 사용하기

이 알고리즘은 Unity에서도 유용하게 사용할 수 있습니다. 

  • 랜덤 적 배치: 위치 배열을 섞어서 배치 순서를 무작위로 변경.
  • 랜덤 이벤트 생성: 특정 이벤트가 발생할 순서를 셔플.

Unity에서 Random.Range를 사용할 경우, 위의 코드에서 System.Random 대신 Unity의 Random 클래스를 사용하면 됩니다.

 

배열 셔플 코드

public static T[] FisherYatesShuffleUnity<T>(T[] array)
{
    for (int i = array.Length - 1; i > 0; i--)
    {
        // i까지의 범위에서 무작위 인덱스를 선택
        int j = Random.Range(0, i + 1);

        // 현재 요소와 무작위 요소를 교환
        T temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    return array;
}

 

리스트 셔플 코드

public static List<T> FisherYatesShuffleUnity<T>(List<T> list)
{
    for (int i = list.Count - 1; i > 0; i--)
    {
        int j = Random.Range(0, i + 1);

        // 현재 요소와 무작위 요소를 교환
        T temp = list[i];
        list[i] = list[j];
        list[j] = temp;
    }

    return list;
}
728x90

'언어 > C#' 카테고리의 다른 글

[C#] 객체지향 프로그래밍 핵심 개념  (0) 2024.12.18