C#

2024 내일 배움캠프(Unity_6기) _ 사전캠프 5일차(08.19) - Random에 대해 알아보자

근본넘치는개발자 2024. 8. 19. 17:02

유니티에는 자체적으로 Random 클래스를 제공하고 있습니다. 

여기서 의문이 생겼습니다. C#에도 Random 클래스가 존재하는데 둘의 차이는 뭐지?

 

그래서 오늘은 System.Random 클래스와

UnityEngine.Random 클래스의 차이 및 그 기능에 대해 자세히 알아보고자 합니다.

 

먼저 UnityEngine.Random부터 알아볼까요.  

 

UnityEngine.Random

보통 Random.Range()를 사용해 임의의 값을 추출하여 사용하고 있을겁니다. 

더보기
더보기

사용시 주의할 점 - Random.Range(1,4)면 실제 나오는 값은 1부터 3까지 나온다.

 

 하지만 분명 이것만이 기능의 전부는 아닐거란 말이죠?

 

 

Unity에서 공식 문서를 통해 UnityEngine.Random의 기능을 설명해주는 걸 찾았습니다.

https://docs.unity3d.com/kr/2020.3/Manual/class-Random.html

 

중요 클래스 - Random - Unity 매뉴얼

Random 클래스는 흔히 요구되는 다양한 타입의 랜덤 값을 쉽게 생성할 수 있는 방법을 제공합니다.

docs.unity3d.com

 

랜덤으로 회전이나 컬러값도 조절할 수 있다는걸 처음 알았네요. 

 

다음을 참고하면 unityEngine.Random에 대해 보다 쉽게 이해할 수 있을것 같습니다.

 

https://unity.com/kr/blog/games/unpredictably-fun-the-value-of-randomization-in-game-design

 

예측할 수 없는 즐거움: 무작위화가 게임 설계에 주는 이점

플레이어가 게임을 계속 재미있게 플레이할 수 있도록 무작위 요소를 추가하는 방법을 알아보세요. 이 글은 시스템 설계에 대한 Christo Nobbs의 시리즈 중 두 번째 글이며, Unity 게임 디자이너 플레

unity.com

 

 

 

다음은 System.Random 클래스 입니다. 

 

System.Random 

 

마찬가지로  윈도우 소프트에서 제공하는 공식 문서를 찾았습니다.

 

https://learn.microsoft.com/ko-kr/dotnet/api/system.random?view=net-8.0

 

Random 클래스 (System)

의사(pseudo) 난수 생성기를 나타냅니다. 이 알고리즘은 무작위성에 대한 통계적인 특정 요구 사항과 일치하는 숫자 시퀀스를 생성합니다.

learn.microsoft.com

 

c#의 사용법도 Unity와 비슷한 듯 하면서 약간 다릅니다.

 

먼저 변수를 선언하고 이를 사용한다는 점이 가장 큰 특징인것 같습니다.

var rand = New Random();

// Next의 경우 int만 가능합니다.
rand.Next(0,1);// 0부터 1사이 임의의 값 반환 - UnityEngine.Random.Range와 같음
rand.Next(1); // 최댓값 1까지 중에서 음수가 아닌 임의의 정수 반환
rand.Next(); // 음수가 아닌 임의의 정수 반환 

// NextDouble의 경우 Double만 가능합니다.
rand.NextDouble() // 0.0이상 1.0 미만 무작위 Double형 반환

 

더 찾아보니 float형 난수의 경우는 없고,

NextDouble을 사용할때 원하는 값을 곱해서 사용하는 거 같더라구요.

 

그래서 둘의 차이가 뭔데? 

 

https://discussions.unity.com/t/what-is-the-difference-between-system-random-and-unityengine-random/160442

 

여기 나온 내용을 요약하자면 

 

UnityEngine.Random은

게임당 하나의 "전역" 난수 값 스트림만 제공하는 정적 클래스입니다.

 

System.Random의 각 인스턴스는 독립적인 난수 생성기 스트림입니다.

 

각 생성기는 nextValue()가 호출될 때만 진행됩니다.

시드에서 시작하는 난수의 재현 가능한 시퀀스를 만드는 것이 훨씬 쉽습니다 .

 

 

게임에서 두 가지 완전히 별개의 이벤트가 있고

둘 다 어느 정도 무작위적인 동작을 한다고 가정해 보겠습니다.

 

상자에서 전리품이 떨어지는 빈도와 총에서 총알이 발사되는 속도의 변화입니다.

 

UnityEngine.Random을 사용하면 두 가지 무작위 분포가 뒤섞이게 됩니다.

총을 발사한 횟수는 상자에서 매우 희귀한 갑옷을 얻을지 결정하는 값에 영향을 미칩니다.

이는 차례로 게임 테스트를 매우 어렵게 만듭니다.

 

따라서 완전히 사소한 무작위 동작이 아닌 모든 것에 대해

System.Random을 사용하는 것이 좋습니다

 

 

결론 : 

UnityEngine.Random 은 글로벌 인스턴스를 사용하므로

서로 다른 랜덤값이 영향을 줄 수 있다.


System.random은 각각의 인스턴스 형식으로 생성되었기 떄문에 영향을 주지않는다 .

 

정도로 정리 할 수 있을 것 같습니다.