Il generatore di numeri casuali di Unity 2017 è deterministico su più piattaforme con lo stesso seme iniziale?


17

Il generatore di numeri casuali dei motori di unità è deterministico su più piattaforme dato lo stesso seme iniziale o devo implementare il mio?

So che ci sono state alcune modifiche al generatore di numeri casuali di recente.

Le risposte sono apprezzate, non ho i dispositivi a portata di mano per eseguire alcun test e non ho ancora trovato una dichiarazione diretta sulla questione.


11
Buona domanda. Ma quando il tuo gioco dipende dalla generazione procedurale deterministica, potresti voler programmare comunque il tuo PRNG nel caso Unity decida di cambiare il loro algoritmo. La documentazione non documenta l'algoritmo, quindi non dovresti assumere alcuna garanzia.
Philipp,

1
Capisco il tuo punto, ma c'è abbastanza lavoro per andare avanti, preferirei imparare in quale stato il PRNG dell'unità è in questo momento e fornire una versione a prova di futuro più in basso. Usarlo senza sapere potrebbe portare ad alcuni bug davvero frustranti. Grazie per il tuo consiglio.
eternalNoob,

2
Secondo il consiglio di @ Philipp. Se hai bisogno di un RNG deterministico, dovresti investire nello scrivere il tuo (e testarlo). Sarai in un mondo di dolore se mai dovessi usare una nuova versione di Unity e l'RNG cambierà di nuovo. Sarà quasi impossibile per te ricreare lo stesso RNG se ciò accade e mantenere la compatibilità con i salvataggi / mondi precedenti.
Stephane Hockenhull,

5
Penso che varrebbe la pena di scrivere un consiglio come una risposta: "Che sia o non sia deterministico ora, non contare sul fatto che sia sempre lo stesso" (Se uno di voi sarebbe così propenso, non voglio rubare il tuono). Ad alcune domande apparentemente sì o no si risponde meglio con "opzione C: altro";)
DMGregory

Risposte:



7

Thomas ha risposto alla domanda come chiesto. La domanda più importante è la seguente:

Il generatore di numeri casuali di Unity 2017 è garantito per fornire gli stessi numeri su tutte le piattaforme attuali e future con lo stesso seme, ed è anche garantito per fornire gli stessi numeri delle versioni future di Unity?

Esiste una probabilità piuttosto elevata che ciò avvenga, ma non è la stessa cosa di una garanzia. Quindi la risposta, sfortunatamente, è " no, non lo è ". Una garanzia dovrebbe essere esplicitamente dichiarata nella documentazione di Random , ma attualmente non esiste nulla del genere.

Personalmente, anche se ci fosse una tale garanzia, consiglierei di non fidarsene - anche con una garanzia c'è ancora una possibilità che l'implementazione venga modificata per errore (un bug), o semplicemente venga deprecata e successivamente rimossa. Ad un certo punto potresti anche voler riutilizzare il generatore al di fuori del framework Unity. Invece di fare affidamento su Unity, basta copiare un generatore di numeri casuali scritto da qualcun altro (assicurati di poter utilizzare il codice) e scrivere un test per verificare che soddisfi i tuoi requisiti di casualità.


4

Utilizzando Unity 2017.2.0f3, UnityEngine.Random sembra fornire gli stessi risultati su più piattaforme. Testato su Windows 10, macOS 10.12 Sierra e Android 7.

Per testare, ho ridotto una classe SeedFactory che ho creato:

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;
    }

}

E un MonoBehaviour per eseguire il test:

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);
    }

}

E i risultati sono stati tutti uguali:

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,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.