101 votes

définir une graine aléatoire à l'échelle du programme en python

J'ai un programme assez important, dans lequel j'utilise des fonctions de l'application random dans différents fichiers. J'aimerais pouvoir définir la graine aléatoire une fois, à un seul endroit, pour que le programme renvoie toujours les mêmes résultats. Cela peut-il être réalisé dans python ?

141voto

Jon Clements Points 51556

Le module python principal qui est exécuté doit import random et appeler random.seed(n) - ce qui est partagé entre toutes les autres importations de random tant qu'un autre endroit ne réinitialise pas la graine.

49voto

Sida Zhou Points 356

zss Le commentaire de l'auteur devrait être souligné comme une réponse réelle :

Une autre chose à laquelle les gens doivent faire attention : si vous utilisez numpy.random alors vous devez utiliser numpy.random.seed() pour définir le semences. Utilisation de random.seed() ne définira pas la graine pour les nombres aléatoires générés à partir de numpy.random . Cela m'a perturbé pendant un moment. -zss

9voto

Chimera Points 2445

Au début de votre application, appelez random.seed(x) en s'assurant que x est toujours le même. Ainsi, la séquence de nombres pseudo-aléatoires sera la même à chaque exécution de l'application.

4voto

Mischa Obrecht Points 931

Jon Clements répond à peu près à ma question. Cependant, ce n'était pas le vrai problème : Il s'avère, que la raison du caractère aléatoire de mon code était le SVD de numpy.linalg car il ne produit pas toujours les mêmes résultats pour les matrices mal conditionnées ! !!

Assurez-vous donc de vérifier cela dans votre code, si vous avez les mêmes problèmes !

3voto

JBSnorro Points 802

Dans le prolongement des réponses précédentes : soyez conscient que de nombreuses constructions peuvent faire diverger les chemins d'exécution, même lorsque toutes les graines sont contrôlées.

Je pensais " J'ai configuré mes graines de façon à ce qu'elles soient toujours les mêmes, et je n'ai pas de dépendances changeantes/externes, donc le chemin d'exécution de mon code devrait toujours être le même. ", mais c'est faux.

L'exemple qui m'a mordu est le suivant list(set(...)) où l'ordre résultant peut être différent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X