Le générateur de nombres aléatoires des moteurs d'unité est-il déterministe sur toutes les plateformes, étant donné la même valeur initiale ou dois-je implémenter le mien?
Je sais qu'il y a eu récemment des modifications au générateur de nombres aléatoires.
Les réponses sont appréciées, je n'ai pas les appareils sous la main pour effectuer des tests et je n'ai pas encore trouvé de déclaration directe à ce sujet.
unity
c#
random
cross-platform
eternalNoob
la source
la source
Réponses:
Bien que je n'aie pas eu le temps de faire des tests approfondis, les premières recherches suggèrent que le générateur de nombres aléatoires utilisé est déterministe sur différentes plates-formes. L'implémentation exacte utilisée est: Unity PRNG . Voir aussi: Graine aléatoire Unity sur un matériel différent .
Avec la
Random
classe Unity , l'état exact du PRNG peut être enregistré, voir: Unity Random Sate .la source
Thomas a répondu à la question comme demandé. La question la plus importante est la suivante:
Il y a une probabilité assez élevée que ce soit le cas, mais ce n'est pas la même chose qu'une garantie. La réponse est donc malheureusement « non, ce n'est pas le cas ». Une garantie devrait être explicitement mentionnée dans la documentation de Random , mais pour l' instant il n'y a rien de tel.
Personnellement, même s'il existait une telle garantie, je recommanderais de ne pas lui faire confiance - même avec une garantie, il y a toujours une chance que l'implémentation soit modifiée par accident (un bogue), ou tout simplement obsolète, puis supprimée. À un moment donné, vous souhaiterez peut-être également réutiliser le générateur en dehors du cadre Unity. Au lieu de compter sur Unity, copiez simplement un générateur de nombres aléatoires que quelqu'un d'autre a écrit (assurez-vous que vous êtes autorisé à utiliser le code) et écrivez un test pour vérifier qu'il répond à vos exigences en matière d'aléatoire.
la source
Avec Unity 2017.2.0f3, UnityEngine.Random semble donner les mêmes résultats sur plusieurs plates-formes. Testé sur Windows 10, macOS 10.12 Sierra et Android 7.
Pour tester, j'ai réduit une classe SeedFactory que j'ai créée:
Et un MonoBehaviour pour exécuter le test:
Et les résultats ont tous été les mêmes:
la source