상세 컨텐츠

본문 제목

유니티 랜덤으로 리스트안의 값을 섞기

유니티/기능

by MJ_119 2024. 10. 2. 22:33

본문

- 리스트 안에 있는 값을 랜덤, 무작위로 섞기

핵심 개념:

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]로 시작한다고 가정하겠습니다.
  • 이 리스트를 섞는 과정을 봅시다.
  1. 첫 번째 반복 (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]는 이미 무작위로 정해진 값입니다.
  2. 두 번째 반복 (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]은 이미 무작위로 정해진 상태입니다.
  3. 세 번째 반복 (i = 2):
    • 이제 i = 2일 때, UnityEngine.Random.Range(2, 5)에서 무작위로 선택된 값이 예를 들어 2라고 해봅시다.
    • randomIndex = 2가 됩니다.
    • randomIndices[2]와 randomIndices[2]의 값을 바꾸는데, 이것은 자기 자신을 바꾸는 것이므로 아무 변화가 없습니다.
      • 리스트는 여전히 [4, 5, 3, 1, 2]입니다.
    • randomIndices[2] = 3도 이제 무작위로 정해졌습니다.
  4. 네 번째 반복 (i = 3):
    • 이제 i = 3일 때, UnityEngine.Random.Range(3, 5)에서 무작위로 선택된 값이 예를 들어 3이라고 해봅시다.
    • randomIndex = 3가 됩니다.
    • randomIndices[3]와 randomIndices[3]의 값을 바꾸는데, 이것은 자기 자신을 바꾸는 것이므로 리스트는 그대로 [4, 5, 3, 1, 2]입니다.
    • 이제 randomIndices[3] = 1도 무작위로 정해졌습니다.
  5. 다섯 번째 반복 (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에서 섞은 값은 다시 선택되지 않고 고정된 상태입니다.
  • 이 과정을 반복하면서 점점 섞을 수 있는 범위가 줄어들고, 마지막에는 리스트 전체가 무작위로 섞이게 됩니다.

관련글 더보기