프로그래밍/유니티 및 C#

[유니티/C#] List에서 중복 없이 뽑기(조합)

바토파 2023. 10. 30. 19:14
반응형

던전에서 한 층에 무작위의 방을 여러 개 배치하기 위해 만든 코드의 일부이다.

만들 방의 프리팹을 ~RoomPrefabs 안에 넣어두고 중복 없이 무작위로 생성하였다.

private void MakeFloor()
{
    List<int> huntingRoomIndex = new List<int>();
    List<int> harvestRoomIndex = new List<int>();
    List<int> emptyRoomIndex = new List<int>();
    
    // 프리팹 개수만큼 인덱스를 저장
    for (int i = 0; i < huntingRoomPrefabs.Length; i++)
    {
        huntingRoomIndex.Add(i);
    }
    
    for (int i = 0; i < harvestRoomsPrefabs.Length; i++)
    {
        harvestRoomIndex.Add(i);
    }
    
    for (int i = 0; i < emptyRoomsPrefabs.Length; i++)
    {
        emptyRoomIndex.Add(i);
    }
    
    // 층에 사용할 방들을 미리 만들어둠
    for (int i = 0; i < huntingRoomCount[floor]; i++)
    {
        int roomIndex = Random.Range(0, huntingRoomIndex.Count); // 무작위 인덱스 구함
        GameObject tempRoom = Instantiate(huntingRoomPrefabs[huntingRoomIndex[roomIndex]], tempRooms.transform);
        huntingRoomIndex.RemoveAt(roomIndex); // 인덱스를 없애서 중복 없이 뽑을 수 있도록 한다
    }

 

간단하게 표현하면 이렇게 된다.

List<int> list = new List<int>(); // 무작위로 뽑고 싶은 리스트
List<int> indexList = new List<int>(); // 인덱스를 저장할 리스트

// 리스트의 길이만큼 인덱스를 저장해둔다
for (int i = 0; i < list.Count; i++)
{
    indexList.Add(i);
}

int count = 10; // 무작위로 몇 개 뽑을 것인지 정함

for (int i = 0; i < count; i++)
{
    int index = Random.Range(0, indexList.Count); // 무작위 인덱스 구함
    // ~ list[index] 사용해서 하고 싶은 일 하기 ~
    indexList.RemoveAt(index); // 인덱스를 없애서 중복 없이 뽑을 수 있도록 한다
}

 

수학을 이용해서 조합을 구하는 방법도 있는데, 내가 만드는 것은 소규모라 이 방법이 더 편한 것 같다.

반응형