본문 바로가기

유니티

유니티 C# 중복 없는 랜덤 구현방법

 

랜덤으로 생성된 큐브의 좌표에 중복이 발생한 것과 그렇지 않은 것

Random 클래스를 이용하면 중복된 값이 나오기도 합니다.

중복된 값을 받아도 되는 경우는 큰 상관이 없지만 그렇지 않은 경우에는 문제가 됩니다.

이 문제를 해결하기 위해 List를 활용해 간단히 구현해보았습니다.

 

랜덤한 좌표에 중복 없이 큐브를 생성하는 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CubeGenerator : MonoBehaviour
{
    List<int> cubeList = new List<int>();
 
    public GameObject cube;
 
    [Range(0100)]
    public int min;
    [Range(0100)]
    public int max;
    
    void Start()
    {
        //CreateDuplicateRandom(min, max);
        CreateUnDuplicateRandom(min, max);
 
        for(int i = 0; i < cubeList.Count; i++)
        {
            Debug.Log(cubeList[i]);
            Instantiate(cube, new Vector3(i , 0 , cubeList[i]), Quaternion.identity);
        }
    }
 
    // 랜덤 생성 (중복 가능)
    void CreateDuplicateRandom(int min, int max)
    {
        for (int i = 0; i < max; i++)
        {
            cubeList.Add(Random.Range(min, max));
        }
    }
    
    // 랜덤 생성 (중복 배제)
    void CreateUnDuplicateRandom(int min, int max)
    {
        int currentNumber = Random.Range(min, max);
 
        for (int i = 0; i < max;)
        {
            if (cubeList.Contains(currentNumber))
            {
                currentNumber = Random.Range(min, max);
            }
            else
            {
                cubeList.Add(currentNumber);
                i++;
            }
        }
    }
}
 
cs

랜덤을 돌려 나온 값이

리스트에 존재하지 않다면, 다시 랜덤을 돌리고

리스트에 존재한다면, 리스트에 해당 값을 추가해주고 증감시켜줍니다.

 

이러한 과정을 거치면 중복 없는 랜덤값으로 구성 할 수 있습니다.

 

 

여기엔 주의할 점이 있는데

랜덤으로 구성된 값들의 범위가 커질수록 반복을 많이해야하기 때문에 적절한 조건이 필요해질 것으로 예상됩니다.

(랜덤 메소드 자체에서 중복을 배제하는게 아니므로)

일반적으로 사용하는데는 문제가 없을 것 같습니다. 행여나 게임의 주요 퍼포먼스가 돌아가는 와중에 실시간 생성해야 한다면 코루틴을 활용할 수도 있을 것 같고요. 아니면 언제나 그렇듯이 답을 찾을 것입니다. (꼼수)

 

 

---- 번외

혹시나 반복문을 얼마나 돌게 될지 궁금해서 찍어보았습니다.

100개의 중복없는 랜덤을 만들기 위해 루프를 돈 횟수는 평균 400번 정도였습니다.