Table of Contents
보통 유니티로 개발하다보면 난수생성이 필요할 때 UnityEngine.Random을 사용하게된다.
다만 비동기화 멀티스레딩 코딩중 Task를 쓸때에는 Task안에서 UnityEngine의 API는 거의 다 사용할 수 없다.
에러를 띄워주는것도 아니고 그냥 그 줄에서 스레드가 작업을 마쳐버리니 굉장히 주의해야 할 부분이다.
그래서 Task에서 난수생성이 필요할때 대체재로 쓸쑤있는 System.Random의 사용법을 메모한다.
공식API 문서를 참조함.
// UnityEngine.Random
void MaKeRandom()
{
// 0~5사이 랜덤 Int를 반환
int rndInt = Random.Range(0, 6);
// 0~5사이 랜덤 Float을 반환
float rndFloat = Random.Range(0f, 5f);
}
이게 익히 알고있는
UnityEngine.Random의 사용법이다.
// System.Random
void MakeRandom()
{
System.Random rand = new System.Random();
// 0~5사이 Int를 반환
int rndInt = rnd.Next(0, 6);
// 최솟값이 0이라면 생략도 가능
int rndInt = rnd.Next(6);
// 0~5사이 Double을 반환
double rndDouble = rand.NextDouble() * 5;
}
이게 System.Random을 사용한 방법인데
특이한점이 몇가지있다.
1. Random타입의 인스턴스를 만들고 사용한다는것
2. float형 난수생성은 없고 double형이 있다는것
3. double형 난수생성은 파라미터로 최소, 최댓값을 줄수없고 수식으로 직접 계산해줘야 한다는것
1번, 2번은 그냥 그렇구나 할수있지만 3번은 조금 귀찮아진다.
double형 난수를 만들 때 최댓값만 지정하고싶다면 위처럼 끝에 * maxValue를 해주면 되고,
최솟값만 지정하고싶다면 끝에 - minValue를 해주면 된다.
하지만 만약 둘다 필요하다면.
Random.NextDouble() * (maxValue - minValue) + minValue
이렇게 계산해서 사용할수 있겠다.
2021-07-29 추가내용
이 예제를 보면 기본시드를 사용해서 난수를 생성할 때 시간을 시드로 쓰는지
거의 동시에 생성된 랜덤은 같은 값이 나온다고한다!
'Unity > C#' 카테고리의 다른 글
C# 확장메소드, List 셔플 (0) | 2021.10.25 |
---|---|
WindowsForm#1-Button 컨트롤 (0) | 2021.08.05 |
[스크랩]GetInstanceID와 GetHashCode (0) | 2021.06.28 |
ScriptableObject에서 OnEnable() (0) | 2021.06.23 |
LayerMask에 해당 Layer가 포함되는지 확인하기 (0) | 2021.05.28 |