<개인공부>/[Unity]

[유니티] 랜덤 함수 Random.Range()

BlockDMask 2022. 5. 11. 06:30
반응형

안녕하세요. BlockDMask입니다.
오늘은 유니티에서 제공해주는 랜덤 함수 Random.Range() 에 대해서 알아보려 합니다.
해당 함수는 함수 오버로딩으로 두 가지 타입으로 만들어져 있습니다. 그렇기에 정수, 실수 둘 다 랜덤 값을 추출할 수 있습니다.

<목차>
1. 유니티 랜덤 함수 Random.Range() 설명 및 정의 살펴보기 (랜덤 클래스 살펴보기)
2. 유니티 정수 랜덤 Random.Range(정수, 정수)
3. 유니티 실수 랜덤 Random.Range(실수, 실수)

 

1. Unity Random.Range() 함수에 대해서 설명


유니티 엔진에서 제공해주는 랜덤 함수는 UnityEngine이라는 네임스페이스 안에 존재합니다.
유니티 스크립트에서 UnityEngine.Random 이라고 작성한 뒤에 "Random"에 마우스를 올리고 우측 버튼(혹은 F12)를 누르면 클래스 정의 부분으로 갈 수 있습니다.

위 캡처를 따라서 클래스 Definition으로 들어가 봅니다.

위 캡처에서 namespace UnityEngine 안에 public static class Random 이라는 클래스가 존재하는 것을 볼 수 있습니다.

해당 랜덤 플래스에는 여러 가지 변수(속성), 함수(메서드)가 존재하는데, 그중 우리는 맨 아래에 있는 Random 함수에 대해서만 이야기할 예정입니다.
맨 아래로 내리면 이렇게 Random 함수들이 존재합니다.

위 캡처를 다시 보면
맨 위에 RandomRange(int, int), RandomRange(float, float) 함수가 존재하는데 이것은 유니티에서 예전에 쓰다가 이제는 버린 함수입니다.

해당 함수 위쪽을 보면 [Obsolete("Use Random.Range instead")] 라고 되어있는데

"해당 함수 Random.RandomRange() 함수는 Obsolete(=쓸모없는, 시대에 뒤떨어진) 이제는 안 쓰는 함수이고 대신에 Random.Range를 써라" 라고 쓰여있는 것을 볼 수 있습니다.

이제는 아래쪽에 보라색 사각형으로 감싸 둔 Randge(int, int), Rangom(float, float) 함수를 사용하면 됩니다.
해당 함수들의 상세 설명은 아래쪽에서 진행하겠습니다.

*당연하겠지만 Random 클래스는 UnityEngine 네임스페이스 내부에 있으므로 using UnityEngine을 선언해주면 UnityEngine.Random.Range() 대신에 Random.Range()로 간편히 사용할 수 있습니다.

 

 

2. 유니티 정수 랜덤 Random.Range(정수, 정수) 예제


함수 설명 부분은 아래와 같이 나와있습니다.

Return a random int within [minInclusive, maxExclusive)

int Random.Range(int, int)
인자로 두 개의 정수 타입의 매개변수를 받고,
반환도 정수 타입을 반환합니다.

위 설명을 보면 정수의 범위는 [최소, 최대)으로 표현되고 있습니다.
알기 쉽게 이야기하면
최소값을 포함(폐구간), 최대값을 포함하지 않음(개구간)이므로

즉, 랜덤으로 반환해주는 정수의 범위는 "최소 정수 ~ (최대 정수 -1)" 의 값을 반환하게 됩니다.

ex) Random.Range(0, 10) 으로 함수를 작성하면 반환 값은 0~9 까지의 숫자만 반환하게 됩니다. (주의 : 10은 반환하지 않음)

예제 코드를 볼까요?

using UnityEngine;
public class Example : MonoBehaviour
{
    private void Start()
    {
        Debug.Log("1차 테스트");
        for (int i = 0; i < 5; ++i)
        {
            // UnityEngine.Random.Range(0, 10);
            // 0 ~ 9 정수
            int result = Random.Range(0, 10);
            Debug.Log($"Random {i + 1}회 : {result}");
        }

        Debug.Log("2차 테스트");
        for (int i = 0; i < 5; ++i)
        {
            // -10 ~ 19 정수
            int result = Random.Range(-10, 20); 
            Debug.Log($"Random {i + 1}회 : {result}");
        }
    }
}

 

 

3. 유니티 실수 랜덤 Random.Range(실수, 실수) 예제


실수 타입으로 오버로딩된 Random.Range 함수 설명을 보면 아래와 같이 나와있습니다.

Returns a random float within [minInclusive .. maxInclusive]

float Random.Range(float, float)
인자로 두 개의 실수 타입의 매개변수를 받고,
반환도 실수 타입을 반환합니다.

정수와 달리 위  함수는 [최소, 최대] 로 표현되고 있습니다.
최소값을 포함(폐구간), 최대값도 포함(폐구간)이므로 "최소실수 ~ 최대실수" 값을 반환하게 됩니다.

즉, Random.Range(0.0f, 1.0f) 의 반환값은 0.0 ~ 1.0 까지의 실수를 반환하게 됩니다. (양쪽 다 포함!)

예제 코드를 볼까요?

using UnityEngine;
public class Example : MonoBehaviour
{
    private void Start()
    {
        Debug.Log("1차 테스트");
        for (int i = 0; i < 5; ++i)
        {
            // UnityEngine.Random.Range(0.0f, 10.0f);
            // 0 ~ 10 실수
            float result = Random.Range(0.0f, 10.0f);
            Debug.Log($"Random {i + 1}회 : {result}");
        }

        Debug.Log("2차 테스트");
        for (int i = 0; i < 5; ++i)
        {
            // -10 ~ 20 실수
            float result = Random.Range(-10.0f, 20.0f);
            Debug.Log($"Random {i + 1}회 : {result}");
        }
    }
}

 

이상으로 유니티 랜덤 함수에 대해서 알아보았습니다.
분명히 기억해야 할 것은 Random.Range() 정수, 실수 랜덤의 최대값 범위가 다르다는 것입니다.
정수는 최대값 -1 까지의 랜덤이라는 점. 꼭 기억하고 사용하시면 될 것 같습니다.
감사합니다.

반응형