유니티 게임 개발 Random.InitState 시드 고정(동일한 난수 시퀀스 사용)

반응형

유니티 게임 개발 Random.InitState 시드 고정(동일한 난수 시퀀스 사용)

1)아래 스크립트에서 두개의 반복문 위 Random.InitState() 함수에 동일한 시드값(seed, 42)을 사용하여 난수 생성기 상태( random number generator state)를 초기화합니다. 

 

2)초기화 이후 첫번째, 두번째 반복문에서 동일한 랜덤값을 출력하는것을 확인할수있습니다(동일한 시드 값에 의해 동일한 난수 시퀀스가 반복)

세번째 반복문 위에 새로운 시드값(999)을 사용하여 초기화하고 다른 랜덤값(새로운 난수 시퀀스)을 출력합니다.

 

 

유니티의 난수 생성기( random number generator)는 특정 시드(seed)에 대해 항상 동일한 난수 시퀀스(사전설정된 순서, 실제로는 무작위가 아님 )를 생성합니다(시드값으로 초기화하면 게임을 재실행하여도 항상 동일한 값을 출력)

https://docs.unity3d.com/6000.2/Documentation/ScriptReference/Random.InitState.html

 

3)아래 스크립트의 두 반복문에서 서로 다른 무작위 값을 출력합니다. 두 번째 반복문의 출력이 첫 번째와 다른 이유는 Random.Range()가 호출될 때마다 전역 난수 상태가 소모(시퀀스 포인터가 이동)되기 때문입니다(UnityEngine.Random의  동작 원리 )

 

4)Random.InitState(42) 호출 시점에서 Unity의 전역 랜덤 상태가 시드(seed) 42 값으로 초기화됩니다.
예를들어 Seed 값 42로 초기화 이후에 시작한 난수 시퀀스
83, 62, 95, 47, 94, 32, 35, 16, 74, 94, . . .

 

첫번째 루프에서 난수 5개를 소비합니다. 전역 상태는 5번째 난수 이후로 진행된 상태가 됩니다(난수 시퀀스 포인터가 5칸 이동)
두번째 루프에서 Random.InitState()를 다시 호출하지 않았기 때문에 전역 상태는 이미 앞쪽에서 5번 소비된 상태로 남아있으며 그 다음 난수 5개를 계속 이어서 사용합니다.

 

 

5)Unity의 Random은 전역 상태를 공유하며 아래에서 서로 다른 두 스크립트(A, B)는 같은 난수 스트림을 이어서 사용합니다.

 

 

6)스크립트 실행 순서(Script Execution Order)에서 A 스크립트가 먼저 실행되도록 설정합니다.

 

7) A 스크립트 InitState() 함수에서 시드 값(42)을 고정했기 때문에 A 스크립트의 반복문에서 시퀀스의 5개 난수가 먼저 소모되고 B 스크립트에서 동일한 시퀀스의 다음 난수 5개를 출력합니다.

 

반응형

댓글

Designed by JB FACTORY