UnityEngine.Random과 System.Random의 차이점은 무엇입니까?


24

이것의 차이점은 무엇입니까

int randomNumber = UnityEngine.Random.Range(0, 10);

// on top of the class
private System.Random _rnd = new System.Random();

// inside a methode of the same class
int randomNumber = _rnd.Next(0, 10);

나는 System.Random항상 클래스 상단에서 초기화해야한다는 것을 알고 있습니다 UnityEngine.Random. 나는 또한 System.Random인턴 "시계"와 함께 작동하며 "임의의"숫자는 그에 기초합니다.

내 질문은 이제 유니티 프로젝트에 사용하기에 마녀 코드 UnityEngine.Random와 다른 차이점이 System.Random있습니까?

답변:


23

아마도 가장 중요한 차이점은 Unity Random.Range가 정적이기 때문에 사용이 약간 더 쉽다는 것입니다. 그러나 C # 기본 클래스 라이브러리 System.Random는 더 많은 제어 및 격리 기능을 제공합니다 .

그들은 또한 다른 실제 구현을 사용할 수도 있지만 (유니티 Random가 시스템 측면에서 구현 된 Random것 같지만) 주목할만한 관심사는 아닙니다. 기본적으로 그들은 같은 종류 의 난수 생성기 일 수 있습니다 : 일부 시드로 정의 된 시퀀스를 반복하는 의사 난수 생성기).

일부 상황에서는 다른 사물에 대해 다른 임의의 스트림을 사용할 수 있기 때문에 제어 문제가 더 관련이 있습니다. 예를 들어, 잠금 단계 네트워킹 네트워킹 컨텍스트에서 게임의 모든 플레이어에서 임의의 게임 플레이 영향 이벤트를 생성하는 데 사용되는 시드를 수정하려고 할 수 있지만 순수하게 사용되는 임의의 숫자 스트림에 대해서는 크게 신경 쓰지 않을 수 있습니다 시각적 이벤트를 통해 더 전통적인 방식으로 스트림을 시드 할 수 있습니다 (예 : 게임 시작시 시스템 가동 시간).

마찬가지로 여러 스레드에서 난수를 생성하려는 경우 경쟁 조건을 방지하기 위해 각 스레드마다 고유 한 임의의 개체를 사용할 수 있습니다. 예를 들어 게임 로직이 여러 스레드에서 실행되고 게임 플레이 리플레이 시스템이있는 경우이 문제가 발생할 수 있습니다.

결국, 일반적으로 하나를 사용하는 것이 더 낫지 는 않지만 오히려 장단점이 있습니다. 발생 가능한 다른 임의의 무작위 시퀀스에서 숫자 시퀀스를 분리해야하거나 시퀀스의 시드를 로컬로 제어해야하는 경우의 인스턴스를 사용하십시오 System.Random. 버리기 용도 나 영향을받지 않는 다른 시나리오를 위해 빠르고 불규칙한 임의의 값이 필요한 경우 Unity의 단순화 된 Random것이 좋습니다.


3
일부 게임이하는 한 가지는 플레이어가 게임을 저장할 때 시드 값을 저장하는 것입니다. 그렇게하면 같은 행동이 같은 결과를 초래합니다. 그것은 쓰레기를 저장하지 못하게하고 나중에 저장하는 것을 잊어 버린 경우 이전 위치로 돌아갈 수 있습니다. 마지막 XCOM은 그렇게했습니다.
GregRos

3
@GregRos 참고로, 이 기사에서 설명한 것처럼 다른 종류의 저장-스 컴핑을 소개 할 ​​수 있습니다. 기본적으로 성공을 거둘 때까지 동일한 이동을 재 시도하는 대신 플레이어는 대부분의 토지에 대해 관심이있는 이동까지 다른 이동 시퀀스를 시도합니다. 미리 정해진 순서대로 성공적인 롤에. 어떤 시스템에서나 절약 할 수있는 방법이 있습니다. Scummers Gonna Scum, 때로는 XCOM처럼 흐름과 함께하는 것이 합리적 입니다.
DMGregory

10

UnityEngine.Random은 몇 가지 사용 편의성 이점이 있습니다.

  • 정적 / 전역 적으로 액세스 가능 — 임의성이 필요한 각 객체 또는 시스템에 대한 인스턴스를 만들 필요가 없습니다. 대부분 또는 모든 스크립트가이 리소스를 공유 할 수 있습니다.

  • 편의 메서드 — Random.Range (), Random.insideUnitSphere, Random.rotationUniform, Random.ColorHSV ()를 사용하여 자신의 수학을 굴릴 필요없이 다양한 유용한 유형의 잘 분포 된 임의 값을 얻을 수 있습니다.

(UnityEngine.Random이 System.Random의 Mono 구현과 다른 크로스 플랫폼 일관성 보장을 제공하는지 여부에 대한 확인을 찾지 못했습니다. 후드에서 동일하거나 동일하지 않을 수 있습니다)

물론이를 위해 System.Random (또는 다른 라이브러리 또는 자신의 PRNG)을 사용하는 자체 클래스를 구축 할 수도 있지만, 필요한 부분은 아닙니다. Unity의 구현은 상자에서 임의의 동작.

즉, 다른 임의의 출처를 사용하려는 경우가 있습니다.

  • 여러 스레드를 사용하는 경우 경합을 피하기 위해 각 스레드마다 자체 의사 난수 소스가 있어야합니다 (UnityEngine.Random은 기본 스레드에서만 액세스 가능)

  • 결정 론적 의사 난수 시퀀스 (예 : 시딩 레벨 생성기)가 필요한 경우, 시스템에 다른 스크립트가 액세스 할 수없는 자체 의사 난수 발생원이 있기 때문에 실행 순서의 차이로 인해 발생하지 않을 수 있습니다. 숫자를 건너 뛰고 믿고 있던 결정론을 어기십시오. 자세한 내용 은 Unity 블로그에 시드 난수에 대한 훌륭한 게시물이 있습니다 .

  • 보안, 도박 또는 고유 ID 생성을 위해 암호화 적으로 강력한 임의성이 필요한 경우이 목적을 위해 특수 라이브러리를 사용해야합니다. UnityEngine.Random 또는 System.Random은 충분한 품질 보증을 제공하지 않습니다.


JoshPetrie와 Jon에게 죄송합니다. 모바일에서 이것을 입력하는 동안 시간이 걸리므로 게시하기 전까지는 귀하의 답변을 보지 못했습니다. 우리 모두 비슷한 근거를 다룬 것 같습니다.
DMGregory

암호화 등급 임의성에 대해서는 RNGCryptoServiceProvider를 참조 하되 속도가 매우 느리고 Unity의 모든 스트리핑 된 .NET 플랫폼에서 제외됨을 명심 하십시오 .
McGuireV10

6

UnityEngine.Random은 정적입니다. 난수 생성기의 여러 인스턴스를 작성하려는 경우 System.Random을 사용하려고합니다.

Unity 구현의 소스 코드를 찾을 수있는 방법은 없지만 Microsoft는 System.Random 의 소스를 제공합니다 .


3
마이크로 소프트의 소스가 Unity가 사용하는 것은 아닙니다. 대신 모노 소스를 봐야합니다.
Arturo Torres Sánchez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.