- 리스트 안에 있는 값을 랜덤, 무작위로 섞기
핵심 개념:
Fisher-Yates 셔플은 앞에서부터 순차적으로 각 인덱스의 값과 무작위로 선택된 값의 위치를 바꾸는 방식입니다. 이때, 이미 섞인 값은 다시 건드리지 않고, 아직 섞지 않은 값들만 무작위로 선택합니다.
1. 큐브 인덱스를 리스트에 추가 (정렬된 상태)
List<int> randomIndices = new List<int>();
for (int i = 1; i < cubes.Count; i++)
{
randomIndices.Add(i);
}
- randomIndices 리스트: 이 리스트는 큐브의 인덱스를 담기 위해 생성된 리스트입니다.
- for (int i = 1; i < cubes.Count; i++): 이 반복문은 cubes 리스트에서 인덱스 1부터 마지막 인덱스까지의 값을 randomIndices 리스트에 추가합니다. (여기서 i = 1은 첫 번째 큐브를 제외한 나머지 큐브들을 대상으로 한다는 의미입니다.)
- randomIndices.Add(i): i 값을 randomIndices 리스트에 추가합니다. 이로써 randomIndices 리스트는 큐브의 인덱스(1부터 큐브 개수 - 1까지)를 순서대로 담게 됩니다.
2. 리스트를 무작위로 섞음
for (int i = 0; i < randomIndices.Count; i++)
{
int randomIndex = UnityEngine.Random.Range(i, randomIndices.Count);
int temp = randomIndices[i];
randomIndices[i] = randomIndices[randomIndex];
randomIndices[randomIndex] = temp;
}
예시로 설명:
가정:
- randomIndices = [1, 2, 3, 4, 5]로 시작한다고 가정하겠습니다.
- 이 리스트를 섞는 과정을 봅시다.
- 첫 번째 반복 (i = 0):
- i = 0일 때, UnityEngine.Random.Range(0, 5)에서 무작위로 선택된 값이 예를 들어 3이라고 합시다.
- 즉, randomIndex = 3이 됩니다.
- 이제 randomIndices[0]와 randomIndices[3]의 값을 바꿉니다.
- randomIndices[0] = 1, randomIndices[3] = 4였으므로, 이 둘을 스왑하면 리스트는 [4, 2, 3, 1, 5]가 됩니다.
- 이제 randomIndices[0] = 4는 더 이상 바뀌지 않습니다. randomIndices[0]는 이미 무작위로 정해진 값입니다.
- 두 번째 반복 (i = 1):
- 이제 i = 1일 때, UnityEngine.Random.Range(1, 5)에서 무작위로 선택된 값이 예를 들어 4라고 해봅시다.
- 즉, randomIndex = 4가 됩니다.
- randomIndices[1]과 randomIndices[4]의 값을 바꿉니다.
- randomIndices[1] = 2, randomIndices[4] = 5였으므로, 스왑하면 리스트는 [4, 5, 3, 1, 2]가 됩니다.
- 이제 randomIndices[1] = 5도 더 이상 바뀌지 않습니다. randomIndices[0]와 randomIndices[1]은 이미 무작위로 정해진 상태입니다.
- 세 번째 반복 (i = 2):
- 이제 i = 2일 때, UnityEngine.Random.Range(2, 5)에서 무작위로 선택된 값이 예를 들어 2라고 해봅시다.
- randomIndex = 2가 됩니다.
- randomIndices[2]와 randomIndices[2]의 값을 바꾸는데, 이것은 자기 자신을 바꾸는 것이므로 아무 변화가 없습니다.
- 리스트는 여전히 [4, 5, 3, 1, 2]입니다.
- randomIndices[2] = 3도 이제 무작위로 정해졌습니다.
- 네 번째 반복 (i = 3):
- 이제 i = 3일 때, UnityEngine.Random.Range(3, 5)에서 무작위로 선택된 값이 예를 들어 3이라고 해봅시다.
- randomIndex = 3가 됩니다.
- randomIndices[3]와 randomIndices[3]의 값을 바꾸는데, 이것은 자기 자신을 바꾸는 것이므로 리스트는 그대로 [4, 5, 3, 1, 2]입니다.
- 이제 randomIndices[3] = 1도 무작위로 정해졌습니다.
- 다섯 번째 반복 (i = 4):
- 마지막으로 i = 4일 때, UnityEngine.Random.Range(4, 5)에서 선택되는 값은 4밖에 없습니다. 그러므로 자기 자신을 선택하게 됩니다.
- 리스트는 여전히 [4, 5, 3, 1, 2]입니다.
- 이제 randomIndices[4] = 2도 결정되었습니다.
정리:
- 첫 번째 반복에서 i = 0일 때, randomIndices[0]는 무작위로 섞이지만, 그 후에는 더 이상 바뀌지 않습니다. 즉, 그 값은 이미 무작위로 정해진 상태입니다.
- 두 번째 반복부터 i = 1일 때는, i = 1부터 끝까지의 값들 중에서 무작위로 하나를 선택하여 섞습니다. 이때, i = 0에서 섞은 값은 다시 선택되지 않고 고정된 상태입니다.
- 이 과정을 반복하면서 점점 섞을 수 있는 범위가 줄어들고, 마지막에는 리스트 전체가 무작위로 섞이게 됩니다.