C ++ std :: mt19937 et sauvegarde d’état / chargement et portabilité

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.

  • Est-ce le meilleur / seul moyen d’économiser? Cela ne me dérangerait pas que la valeur de l’état binary de taille fixe ne soit pas cette chaîne séparée par des espaces que j’ai ensuite besoin de préfixer ou de placer des délimiteurs pour mon format de fichier.
  • Est-ce du tout portable? Par exemple, puis-je transférer cela entre différentes versions du compilateur, ou même entre MSVC et GCC, afin de produire le même dataset avec des dissortingbutions configurées de manière identique (avec une petite marge d’erreur dans le cas d’une virgule flottante et exact dans le cas d’un calcul de nombre entier)?

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