C#에서 Linq로 랜덤 하게 섞기
list의 요소들을 랜덤 하게 섞고 싶을 때 Linq OrderBy()에서 random 객체의 Next()를 호출하면 간단하게 해당 요소들을 섞을 수 있다.
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var list = new List<int>() { 1, 2, 3, 4, 5 };
var random = new Random();
var randomized = list.OrderBy(x => random.Next());
foreach (var i in randomized)
{
Console.WriteLine(i);
}
}
}
객체들도 랜덤하게 섞는 것이 가능하다.
using System;
using System.Collections.Generic;
using System.Linq;
namespace shuffle_list
{
public class Person
{
string name;
public Person(string name)
{
Name = name;
}
public string Name
{
get => name;
set => name = value;
}
}
class Program
{
static void Main(string[] args)
{
List<Person> list1 = new List<Person>();
list1.Add(new Person("Person 1"));
list1.Add(new Person("Person 2"));
list1.Add(new Person("Person 3"));
list1.Add(new Person("Person 4"));
list1.Add(new Person("Person 5"));
var rnd = new Random();
var randomized = list1.OrderBy(item => rnd.Next());
foreach (var value in randomized)
{
Console.WriteLine(value.Name);
}
}
}
}
Fisher-Yates Shuffle 알고리즘을 사용하여 목록 섞기
Fisher-Yates 셔플 알고리즘은 C#에서 유한 데이터 구조를 셔플한다. 목록의 각 요소를 목록 내의 임의 색인에 순차적으로 저장한다. 아래의 예를 살펴보자.
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
var list = new List<int>() { 1, 2, 3, 4, 5 };
list.Shuffle();
foreach (var i in list)
{
Console.WriteLine(i);
}
}
}
public static class Extension
{
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;
}
}
}
함께 읽으면 좋은 글
참고 사이트
'프로그래밍 > C#' 카테고리의 다른 글
C# 공변성(Covariance)이란 무엇인가? (0) | 2024.03.26 |
---|---|
C# 제네릭 대리자(Generic Delegate) (1) | 2024.03.26 |
C# 비트 연산자를 이용한 홀수짝수 판별, 절반으로 나누기 함수 구현 (0) | 2024.03.18 |
C# char를 int로 바꾸는데 '0'을 빼는 이유 (0) | 2024.02.26 |
C# StringBuilder에 대해서 (0) | 2024.02.21 |
댓글