728x90
랜덤 배열 셔플은 게임 개발, 데이터 샘플링 등 무작위화가 필요한 여러 상황에서 유용하게 사용됩니다.
이번 글에서는 C#에서 배열과 리스트를 무작위로 섞는 방법을 다루고, 이를 구현하는 데 가장 널리 알려진 Fisher-Yates Shuffle 알고리즘를 소개합니다ㅏ.
배열과 리스트의 무작위화 필요성
배열이나 리스트를 무작위로 섞는 기능은 게임에서 특히 자주 사용됩니다.
- 카드 게임: 덱을 무작위로 섞기.
- 적 스폰: 특정 패턴 없이 랜덤한 위치에 적을 배치.
- 퀴즈: 문제나 보기의 순서를 무작위로 섞기.
Fisher-Yates Shuffle 알고리즘이란?
Fisher-Yates Shuffle 알고리즘은 배열이나 리스트의 요소를 무작위로 섞는 효율적인 방법입니다.
작동 원리는 입니다.
- 배열의 마지막 요소부터 시작하여, 현재 요소와 랜덤한 이전 요소를 교환합니다.
- 이를 배열의 첫 번째 요소까지 반복합니다.
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 |
---|