Является ли генератор случайных чисел Unity 2017 на разных платформах одинаковым начальным числом?

17

Является ли генератор случайных чисел единичных двигателей детерминированным на разных платформах с одним и тем же начальным начальным числом или я должен реализовать свой собственный?

Я знаю, что в последнее время в генератор случайных чисел были внесены некоторые изменения.

Ответы приветствуются, у меня нет под рукой устройств для проведения каких-либо тестов, и я пока не нашел прямого заявления по этому вопросу.

eternalNoob
источник
11
Good question. But when your game depends on deterministic procedural generation, you might want to program your own PRNG anyway in case Unity ever decides to change their algorithm. The documentation doesn't document the algorithm, so you should not assume any guarantees.
Philipp
1
Я понимаю вашу точку зрения, но работы достаточно для продолжения, я бы лучше узнал, что представляет собой PRNG от State Unity прямо сейчас, и предоставлю версию, подтверждающую будущее, в дальнейшем. Использование этого без ведома может привести к некоторым действительно расстраивающим ошибкам. Спасибо за ваш совет.
eternalNoob
2
Я второй @ Филипп совет. Если вам нужен детерминистический ГСЧ, вы должны инвестировать в написание собственного (и его тестирование). Вы окажетесь в мире боли, если вам когда-нибудь понадобится использовать новую версию Unity, а ГСБ снова изменится. Если это произойдет, вам будет практически невозможно воссоздать тот же ГСЧ и сохранить совместимость с предыдущими сохранениями / мирами.
Стефан Хоккенхалл
5
I think that advice would be worth writing up as an answer, "Whether it is or is not deterministic now, don't count on it always being the same" (If either of you would be so inclined — I don't want to steal your thunder). Some ostensibly yes or no questions are better answered with "option C: other" ;)
DMGregory

Ответы:

7

Thomas answered the question as asked. The more important question is as follows:

Is the Unity 2017 random number generator guaranteed to deliver the same numbers across all current and future platforms given the same seed, and is it also guaranteed to deliver the same numbers as future releases of Unity?

There is a rather high likelihood for this being the case, but that isn't the same as a guarantee. So the answer, unfortunately, is "no, it is not". A guarantee would need to be explicitly stated in the documentation of Random, but currently there is no such thing.

Personally, even if there were such a guarantee, I'd recommend not to trust it - even with a guarantee there's still a chance of the implementation being changed by accident (a bug), or simply being deprecated and later removed. At some point you also might want to reuse the generator outside of the Unity framework. Instead of relying on Unity, just copy a random number generator someone else wrote (make sure you're allowed to use the code), and write a test to verify it satisfies your requirements for randomness.

Peter - Unban Robert Harvey
источник
4

Используя Unity 2017.2.0f3, UnityEngine.Random, по- видимому, дает одинаковые результаты на разных платформах. Протестировано на 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,
Крис Макфарланд
источник