Je veux être capable de sauvegarder et de charger l’état d’un RNG afin de pouvoir reproduire les mêmes valeurs aléatoires à partir d’un point donné (sauvegarde / instantané d’application).
Je vois qu’il y a un opérateur <> surchargé, qui semble enregistrer une chaîne sous forme de séquence de nombres.
Oui, l’ operator<<
et l' operator>>
sont le seul moyen d'importer ou d'exporter l'état d'un générateur de nombres aléatoires. Vous pouvez facilement convertir la représentation textuelle en binary, si vous le souhaitez.
La mt19937
et la sérialisation de l'état mt19937
doivent être portables entre les implémentations. Le résultat de la lecture et de l'écriture de l'état du moteur via les opérateurs de diffusion en continu est bien défini par la norme, tant que vous vous assurez que les stream sont imprégnés des mêmes parameters régionaux.
Voir le § 26.5.1.5 pour les exigences de l' operator<<
et l' operator>>
, suivi du § 26.5.3.2 pour la représentation textuelle de mersenne_twister_engine
, dont mt19937
est un typedef bien défini.
En plus de la réponse précédente:
L’exportation de la représentation textuelle via op << ne sauvegardera l'état RNG approprié que si elle est relue via op >> en utilisant les mêmes parameters régionaux. Changer les parameters régionaux posera problème
le choix de default_random_engine
est défini par l’implémentation. C’est un typedef, mais il est permis de le configurer sur différents moteurs réels sur différentes plateformes (§ 26.5.5). Ainsi, utiliser op << et op >> pour sauvegarder / restaurer des états interdit l’utilisation du moteur par défaut
Bien que les générateurs soient spécifiés de manière assez rigoureuse, je ne pense pas que les dissortingbutions doivent être identiques entre les plates-formes. L’état de sauvegarde pourrait ne pas vous aider beaucoup avec la reproductibilité ici
Je recommanderais d’avoir ce document à scope de main, juste au cas où http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf