Чи визначається генератор випадкових чисел Unity 2017 на всіх платформах тим самим початковим насінням?


17

Чи визначається генератор випадкових чисел детермінованим на платформах однаковим початковим початком або я повинен реалізувати свій власний?

Я знаю, що нещодавно змінилися генератори випадкових чисел.

Відповіді цінуються, у мене немає приладів, щоб проводити тести, і я ще не знайшов прямої заяви з цього приводу.


11
Гарне питання. Але коли ваша гра залежить від детермінованої процедурної генерації, ви все одно можете запрограмувати свій власний PRNG у випадку, якщо Unity коли-небудь вирішить змінити їх алгоритм. Документація не документально підтверджує алгоритм, тому не слід брати жодних гарантій.
Філіпп

1
Я розумію вашу думку, але для роботи над цим достатньо роботи, я б краще дізнатися, в чому зараз працює PRNG єдності держави, і надавати наступну доказову версію далі. Використання його, не знаючи, може призвести до справді неприємних помилок. Дякую за вашу пораду.
ВічнийNoob

2
Я друга @ порада Філіпа. Якщо вам потрібен детермінований RNG, ви повинні інвестувати в написання свого власного (і тестування). Ви потрапите в світ шкоди, якщо вам буде потрібно скористатися новою версією Unity, і RNG знову зміниться. Вам буде майже неможливо відтворити той же RNG, якщо це станеться і зберегти сумісність з попередніми збереженнями / світами.
Стефан Хокенхолл

5
Я думаю, що поради варто було б записати як відповідь: "Чи це зараз, чи не детерміновано, не розраховуйте на те, що вона завжди однакова" (Якщо хтось із вас настільки схильний - я не хочу вкрасти грім). На деякі начебто так чи ні питання краще відповісти "Варіант С: інше";)
DMGregory

Відповіді:


8

Хоча я не встиг зробити будь-якого обширного тестування, початкові дослідження показують, що генератор випадкових чисел використовується детерміновано на різних платформах. Точна реалізована реалізація: Unity PRNG . Дивіться також: Unity Random Seed на різних обладнаннях .
З Randomкласом Unity точний стан PRNG можна зберегти, див.: Unity Random Sate .


7

Томас відповів на запитання, як його задали. Більш важливе питання полягає в наступному:

Чи гарантовано генератору випадкових чисел Unity 2017, що доставить однакові номери на всіх поточних та майбутніх платформах, одне і те ж насіння, і чи гарантується також те, що вони будуть отримувати ті ж номери, що й майбутні випуски Unity?

Існує досить велика ймовірність цього, але це не те саме, що гарантія. Тож відповідь, на жаль, - « ні, це не так ». Гарантія повинна бути чітко зазначена в документації Random , але наразі такого немає.

Особисто, навіть якщо була така гарантія, я б рекомендував не довіряти їй - навіть із гарантією все ж є ймовірність зміни програми випадково (помилка), або просто її застарілі та пізніше видалені. У якийсь момент ви також можете скористатись генератором поза рамками Unity. Замість того, щоб покладатися на Unity, просто скопіюйте генератор випадкових чисел, який написав інший (переконайтеся, що вам дозволяється використовувати код), і напишіть тест, щоб переконатися, що він відповідає вашим вимогам щодо випадковості.


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,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.