[C#] C# List Shuffle 하는 방법, Random()으로 순서 섞기

728x90
반응형

 

 

 

 

 

1. Linq OrderBy()를 사용해서 목록 섞기

 

public static List<string> Shuffle(List<string> values)
{
    Random rand = new Random();
    var shuffled = values.OrderBy(_ => rand.Next()).ToList();

    return shuffled;
}

Linq의 OrderBy() 메소드를 이용하면, 지정된 비교자를 사용하여 시퀀스의 요소를 정렬합니다.

Random()을 사용해서 순서를 무작위로 섞기 위해 위와 같이 메소드를 구성 할 수 있는데요.

 

 

static void Main(string[] args)
{
    List<string> values = new List<string>() { "A", "B", "C", "D", "E" };
    var valuse2 = EtcUtil.Shuffle(values);
    foreach (var item in valuse2)
    {
        Console.WriteLine(item);
    }
}

저는 Method를 구성해서 호출하는 방식을 이용했고, 위와같이 호출하면, 아래의 출력결과를 얻을 수 있습니다. 

 

 

 

출력 : 

 

 

 

 

 

 

 

 

 

2. Fisher-Yates Shuffle 알고리즘을 사용하여 목록 섞기

 

public static class Extensions
{
    private static Random random = new Random();

    public static void Shuffle<T>(this IList<T> values)
    { 
        for (int i = values.Count - 1; i > 0; i--) 
        {
            int k = random.Next(i + 1);
            T value = values[k];
            values[k] = values[i];
            values[i] = value;
        }
    }
}

 

Fisher-Yates 셔플 알고리즘은 C#에서 데이터 구조를 Shuffle합니다.  

 

Fisher-Yates 셔플 알고리즘은 Random.Next() 함수를 사용해 얻은 인덱스값(k)을 현재의 순서 (i) 와 바꿔주는 역활을 합니다. 이 경우 편향되지 않은 배열을 생성해주며, 시간 복잡도 O(n) 으로 빠른편에 속합니다. 

 

위의 코드는 C#에서 Fisher-Yates 셔플 알고리즘을 사용하여 목록을 셔플하는 방법을 보여줍니다.

 

 

 

static void Main(string[] args)
{

    List<int> values = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    values.Shuffle();

    foreach (var item in values)
    {
        Console.WriteLine(item);
    }
}

static Method 를 이용해서 구현했고, Shuffle() Method 에 this 인자를 이용해서 구성하였기 때문에, 

외부 함수를 맴버 함수처럼 호출 할 수 있게 해줍니다. 

그래서 Extension Method 의 느낌을 더 잘 나타낼수 있습니다. 

 

 

 

 

출력 : 

 

 

 

 

 

참조

https://www.delftstack.com/ko/howto/csharp/shuffle-a-list-in-csharp/

https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

 

 

 

 

 

 

 

 

END


 

 

 

 

 

 

 

 

728x90