Dans Julia, la graine de la RNG globale peut être définie avec Comment puis-je récupérer la graine ou l'état actuel du Global RNG, par exemple. à nouveau à un moment ultérieur? P> L'objectif est d'obtenir l'état de la RNG à un moment donné et de le recréer dans une session différente, sans connaître la graine initiale ou tous les appels à RNG qui s'est passé. En attendant. p> Par exemple, R permet d'accéder à la graine actuelle à travers p> J'espérais qu'une manière équivalente existerait dans Julia. < / p> p>
6 Réponses :
Une solution évidente consiste à enregistrer la valeur de la graine avant d'appeler Alternativement, si vous connaissez le RNG étant utilisé, et ce n'est pas cryptographiquement sécurisé, vous pouvez calculer les valeurs des chiffres pseudo-aléatoires qu'il produit. Par exemple, voir craquer un générateur confortable linéaire P> srand (graine) code>. p>
La génération de nombres aléatoires à Julia utilise la bibliothèque Twister Mersenne.
Ce n'est pas documenté, mais La source est assez facile à lire. Je ne sais pas comment obtenir l'état actuel du RNG, mais cela pourrait être dans le base.random.random_seed code> Votre ami est votre ami pour obtenir la graine:
DSFMT code>
module p> p>
Ceci est maintenant accessible via base.random.global_rng.seed code>, au lieu de
base.random.random_seed code>.
Utilisation d'un mersensetwister spécialisé avec une variable explicite (au lieu de la mondialisation cachée fournie par les fonctions de valeurs aléatoires par défaut), les fonctionnalités que vous avez besoin peuvent être fournies:
newmt = Base.Random.MersenneTwister(123) randvec = [rand(newmt) for i=1:100] # save state now savestate = deepcopy(newmt.state) randvec2 = [rand(newmt) for i=1:20] # rewind state to old state newmt.state = savestate randvec3 = [rand(newmt) for i=1:20] if randvec2==randvec3 println("works!") end
Pour un meilleur contrôle lors de l'utilisation d'un générateur aléatoire dans les fonctions et en général,
Vous devez obtenir la graine comme celle-ci test: p> pour sauver une restauration de l'état complet de RNG que vous pouvez faire le chose simple et stockez simplement l'ensemble dans mon package privé i Faites économiser / lire manuellement l'état RNG sur HDF5, voir Ici . P> Edit: Ceci bien sûr une version plus explicite de la réponse de @ iAindunning p> p> base.random.global_rng code> objet. Un moyen facile d'utiliser package JLD . P>
Étant donné que les autres réponses à cette question concernent les anciennes versions de Julia et ne fonctionnent plus, j'ai décidé de poster une nouvelle réponse.
dans Julia version> = 1.0, le champ dans Julia 1.4 et 1.5 Il y a la fonction dans julia 1.0, Je suis venu avec cette solution après avoir traversé le code source Julia, donc je ne fais pas " t sais à quel point cette solution sera à nouveau sur cette solution.
(La fonction Je n'ai pas réussi à extraire uniquement la graine en tant que nombre unique qui peut être utilisé dans un appel à base.random. Global_rng code> n'existe plus.
Dans Julia 1.0, il y a un champ
aléatoire.global_rng code> dans le package code> aléatoire code> (qui ne fait plus partie de
base code>). Récupération de la graine de là et la réglage comme décrit dans la réponse https://stackoverflow.com/a/47900426/3180809 Ne fonctionne plus. P>
aléatoire.default_rng () code>. J'ai réussi à obtenir le comportement souhaité d'enregistrer et de rétablir l'état du générateur aléatoire avec le code suivant: p>
aléatoire.global_rng code> peut être utilisé à la place de
aléatoire.defaulaul_rng () code> pour obtenir le même résultat. p>
aléatoire.default_rng () code> n'est ni exportée ni documentée.) P>
aléatoire.sed! code> pour rétablir un état d'un générateur de nombres aléatoires en cours d'exécution. Je serais également intéressé par des suggestions ou des discussions si cela est possible. P> p>
Lire le manuel fabuleux .
@Jurgemaister Cette partie fait référence à la définition de la graine. Je ne pouvais trouver aucune mention sur la façon de le récupérer.
@gurgemaister: Vous ne semblez pas comprendre la différence entre le réglage de la graine et découvrir plus tard ce que la graine a été réglée.
@Jurgemaister Ma question ne concerne pas comment définir la graine, ni comment générer des nombres aléatoires. Il s'agit de savoir comment revenir à l'état de la RNG à un moment donné, de sorte que je puisse recréer le même état dans une autre session.
Les questions de lecture sont également importantes.