동일한 초기 시드가 지정된 플랫폼에서 Unity 2017 난수 생성기가 결정적입니까?


17

단일 엔진에 동일한 초기 시드가 지정된 플랫폼에서 난수 생성기가 결정 론적입니까, 아니면 직접 구현해야합니까?

최근에 난수 생성기에 약간의 수정이 있었음을 알고 있습니다.

답변을 주셔서 감사합니다. 테스트를 수행 할 장치가 없으며 아직이 문제에 대한 직접적인 진술을 찾지 못했습니다.


11
좋은 질문. 그러나 게임이 결정 론적 절차 생성에 의존하는 경우 Unity가 알고리즘을 변경하기로 결정한 경우 자신의 PRNG를 프로그래밍 할 수 있습니다. 설명서에는 알고리즘이 문서화되어 있지 않으므로 보증을 가정해서는 안됩니다.
Philipp

1
나는 당신의 요점을 이해하지만, 아직 할 일이 충분합니다. 저는 현재 국가 연합의 PRNG가 무엇인지 배우고 미래의 증거 버전을 제공하고 싶습니다. 모른 채로 사용하면 정말 실망스러운 버그가 발생할 수 있습니다. 조언 해 주셔서 감사합니다.
eternalNoob

2
@Philipp의 조언에 이어 두 번째입니다. 결정적인 RNG가 필요한 경우 직접 작성하고 테스트하는 데 투자해야합니다. 새로운 Unity 버전을 사용해야하고 RNG가 다시 바뀌면 다 치지 않을 것입니다. 이 경우 동일한 RNG를 다시 작성하고 이전 저장 / 세계와의 호환성을 유지하는 것은 거의 불가능합니다.
Stephane Hockenhull

5
나는 조언이 "지금 결정적이든 아니든, 항상 똑같을 것이라고 생각하지 말라"는 답으로 쓸만한 가치가 있다고 생각합니다. 천둥을 훔치십시오). 표면 상으로 예 또는 전혀없는 질문은 "옵션 C : 기타"로 더 잘 대답합니다.;)
DMGregory

답변:



7

토마스 는 질문 따라 질문에 대답했습니다. 더 중요한 질문은 다음과 같습니다.

Unity 2017 난수 생성기는 동일한 시드가 주어지면 현재 및 미래의 모든 플랫폼에서 동일한 숫자를 제공한다고 보장됩니까?

이 경우에 대한 가능성은 다소 높지만 보장과는 다릅니다. 따라서 안타깝게도 대답은 " 아니오, 그렇지 않습니다 "입니다. Random 문서에 보증을 명시 적으로 명시해야 하지만 현재 는 그런 것이 없습니다.

개인적으로, 그러한 보증이 있었더라도 그것을 믿지 않는 것이 좋습니다. 보장으로도 구현이 우연히 변경되거나 (버그) 단순히 사용되지 않고 나중에 제거 될 가능성이 있습니다. 언젠가 Unity 프레임 워크 외부에서 생성기를 재사용 할 수도 있습니다. Unity에 의존하는 대신 다른 사람이 작성한 난수 생성기를 복사하고 (코드를 사용할 수 있는지 확인) 임의성 요구 사항을 충족하는지 테스트하는 테스트를 작성하십시오.


4

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,
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.