9
votes

Récupérer des graines RNG en Julia

Dans Julia, la graine de la RNG globale peut être définie avec xxx

Comment puis-je récupérer la graine ou l'état actuel du Global RNG, par exemple. à nouveau à un moment ultérieur?

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.

Par exemple, R permet d'accéder à la graine actuelle à travers xxx

J'espérais qu'une manière équivalente existerait dans Julia. < / p>


5 commentaires

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.


6 Réponses :


0
votes

Une solution évidente consiste à enregistrer la valeur de la graine avant d'appeler srand (graine) .

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


1 commentaires

La génération de nombres aléatoires à Julia utilise la bibliothèque Twister Mersenne.



6
votes

base.random.random_seed Votre ami est votre ami pour obtenir la graine: xxx

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 DSFMT module


1 commentaires

Ceci est maintenant accessible via base.random.global_rng.seed , au lieu de base.random.random_seed .



2
votes

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


0 commentaires

0
votes

Pour un meilleur contrôle lors de l'utilisation d'un générateur aléatoire dans les fonctions et en général, xxx


0 commentaires

4
votes

Vous devez obtenir la graine comme celle-ci xxx

test: xxx

pour sauver une restauration de l'état complet de RNG que vous pouvez faire le chose simple et stockez simplement l'ensemble base.random.global_rng objet. Un moyen facile d'utiliser package JLD .

dans mon package privé i Faites économiser / lire manuellement l'état RNG sur HDF5, voir Ici .

Edit: Ceci bien sûr une version plus explicite de la réponse de @ iAindunning


0 commentaires

0
votes

É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 base.random. Global_rng n'existe plus. Dans Julia 1.0, il y a un champ aléatoire.global_rng dans le package aléatoire (qui ne fait plus partie de base ). 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.

dans Julia 1.4 et 1.5 Il y a la fonction aléatoire.default_rng () . 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: xxx

dans julia 1.0, aléatoire.global_rng peut être utilisé à la place de aléatoire.defaulaul_rng () pour obtenir le même résultat.

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 aléatoire.default_rng () n'est ni exportée ni documentée.)

Je n'ai pas réussi à extraire uniquement la graine en tant que nombre unique qui peut être utilisé dans un appel à aléatoire.sed! 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.


0 commentaires