단일 엔진에 동일한 초기 시드가 지정된 플랫폼에서 난수 생성기가 결정 론적입니까, 아니면 직접 구현해야합니까?
최근에 난수 생성기에 약간의 수정이 있었음을 알고 있습니다.
답변을 주셔서 감사합니다. 테스트를 수행 할 장치가 없으며 아직이 문제에 대한 직접적인 진술을 찾지 못했습니다.
단일 엔진에 동일한 초기 시드가 지정된 플랫폼에서 난수 생성기가 결정 론적입니까, 아니면 직접 구현해야합니까?
최근에 난수 생성기에 약간의 수정이 있었음을 알고 있습니다.
답변을 주셔서 감사합니다. 테스트를 수행 할 장치가 없으며 아직이 문제에 대한 직접적인 진술을 찾지 못했습니다.
답변:
광범위한 테스트를 수행 할 시간이 없었지만 초기 연구에 따르면 사용 된 난수 생성기는 여러 플랫폼에서 결정 론적이라고합니다. 사용 된 정확한 구현은 Unity PRNG 입니다. 다른 하드웨어의 Unity Random Seed 도 참조하십시오 .
Unity Random
클래스를 사용하면 PRNG의 정확한 상태를 저장할 수 있습니다 ( Unity Random Sate 참조) .
토마스 는 질문 에 따라 질문에 대답했습니다. 더 중요한 질문은 다음과 같습니다.
Unity 2017 난수 생성기는 동일한 시드가 주어지면 현재 및 미래의 모든 플랫폼에서 동일한 숫자를 제공한다고 보장됩니까?
이 경우에 대한 가능성은 다소 높지만 보장과는 다릅니다. 따라서 안타깝게도 대답은 " 아니오, 그렇지 않습니다 "입니다. Random 문서에 보증을 명시 적으로 명시해야 하지만 현재 는 그런 것이 없습니다.
개인적으로, 그러한 보증이 있었더라도 그것을 믿지 않는 것이 좋습니다. 보장으로도 구현이 우연히 변경되거나 (버그) 단순히 사용되지 않고 나중에 제거 될 가능성이 있습니다. 언젠가 Unity 프레임 워크 외부에서 생성기를 재사용 할 수도 있습니다. Unity에 의존하는 대신 다른 사람이 작성한 난수 생성기를 복사하고 (코드를 사용할 수 있는지 확인) 임의성 요구 사항을 충족하는지 테스트하는 테스트를 작성하십시오.
UnityEngine.Random 은 Unity 2017.2.0f3을 사용하여 여러 플랫폼에서 동일한 결과를 제공하는 것으로 보입니다. Windows 10, macOS 10.12 Sierra 및 Android 7에서 테스트되었습니다.
테스트하기 위해 내가 만든 SeedFactory 클래스를 정리했습니다.
using UnityEngine;
public class SeedFactory {
private Random.State state;
public SeedFactory (int seed) {
Random.InitState(seed);
state = Random.state;
}
// Set Unity's global Random state with this SeedFactory's state, get a random int,
// then set our SeedFactory's state with the new state.
// (this allows us to use multiple SeedFactories for multiple paths of determinism
// if desired)
public int GetRandomInt (int minInclusive, int maxExclusive) {
Random.state = state;
int randomInt = Random.Range(minInclusive, maxExclusive);
state = Random.state;
return randomInt;
}
}
그리고 테스트를 실행하는 MonoBehaviour :
public class SeedTest : MonoBehaviour {
void Start () {
SeedFactory seedFactory = new SeedFactory(123456789);
string result = "";
for (int i = 0; i < 20; i++) {
result += seedFactory.GetRandomInt(int.MinValue, int.MaxValue) + ", ";
}
Debug.Log(result);
}
}
결과는 모두 동일합니다.
Windows Editor:
217814258, 711215697, 1793372675, -1318111305, -513578644, 1776128467, -1503243711, -285471819, -1800526065, -1845985472, -2061970588, 188207569, 1858341351, -1139513088, 2136219157, 1255727479, -2070068486, 459175680, 1151694536, 1232856178,
Windows Standalone:
217814258, 711215697, 1793372675, -1318111305, -513578644, 1776128467, -1503243711, -285471819, -1800526065, -1845985472, -2061970588, 188207569, 1858341351, -1139513088, 2136219157, 1255727479, -2070068486, 459175680, 1151694536, 1232856178,
macOS Standalone:
217814258, 711215697, 1793372675, -1318111305, -513578644, 1776128467, -1503243711, -285471819, -1800526065, -1845985472, -2061970588, 188207569, 1858341351, -1139513088, 2136219157, 1255727479, -2070068486, 459175680, 1151694536, 1232856178,
Android:
217814258, 711215697, 1793372675, -1318111305, -513578644, 1776128467, -1503243711, -285471819, -1800526065, -1845985472, -2061970588, 188207569, 1858341351, -1139513088, 2136219157, 1255727479, -2070068486, 459175680, 1151694536, 1232856178,