[C#] C# List Shuffle 하는 방법, Random()으로 순서 섞기
2024. 1. 22. 10:00
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
'Program Language > C#' 카테고리의 다른 글
[C#] 문자열 서식, string.Format() 및 보간을 이용한 간격 맞추기 (1) | 2023.12.18 |
---|---|
[C#] ObsoleteAttribute 특성을 사용하여, 사용안하는 메소드 표시 (0) | 2023.09.11 |
[C#] C#에서 TLS 1.2를 사용하도록 변경하기 (0) | 2023.03.24 |
[C#] 특정 소수점 이하 올림, 버림 처리하기 (0) | 2022.05.19 |
[C#] C#에서의 반올림, 올림, 버림 처리 (0) | 2022.05.18 |