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
?
Réponses
Trop de publicités?Une mise en garde importante est que pour les versions de python antérieures à 3.7, les clés de dictionnaire ne sont pas déterministes. Cela peut conduire à un caractère aléatoire dans le programme ou même à un ordre différent dans lequel les nombres aléatoires sont générés et donc à des nombres aléatoires non déterministes. Conclusion : mettez à jour python.
J'étais également perplexe face à la question de la reproduction d'un projet d'apprentissage profond, et j'ai donc réalisé une petite expérience pour partager les résultats avec vous.
Je crée deux fichiers dans un projet, qui sont nommés test1.py
y test2.py
respectivement. Sur le site test1
j'ai mis random.seed(10)
pour le random
et imprimer 10 nombres aléatoires plusieurs fois. Comme vous pouvez le vérifier, les résultats sont toujours les mêmes.
Qu'en est-il test2
? Je procède de la même manière, à l'exception de la mise en place de la semence pour la random
Les résultats s'affichent différemment à chaque fois. Cependant, tant que j'importe test1
--- même sans l'utiliser, les résultats sont les mêmes qu'en test1
.
L'expérience aboutit donc à la conclusion que si vous voulez définir la graine pour tous les fichiers d'un projet, vous devez importer le fichier/module qui définit et définit la graine.
Selon le rapport de Jon réponse , réglage random.seed(n)
au début du programme principal permet de régler la semence de manière globale. Ensuite, pour définir les graines des bibliothèques importées, on peut utiliser la sortie de random.random()
. Par exemple,
rng = np.random.default_rng(int(abs(math.log(random.random()))))
tf.random.set_seed(int(abs(math.log(random.random()))))
Vous pouvez le garantir assez facilement en utilisant votre propre générateur de nombres aléatoires.
Il suffit de choisir trois grands nombres premiers (en supposant que ce n'est pas une application de cryptographie), et de les insérer dans a, b et c : a = ((a * b) % c) Cela donne un système de rétroaction qui produit des données assez aléatoires. Notez que tous les nombres premiers ne fonctionnent pas de la même manière, mais si vous ne faites qu'une simulation, cela ne devrait pas avoir d'importance - tout ce dont vous avez besoin pour la plupart des simulations est un enchevêtrement de nombres avec un modèle (pseudo-aléatoire, rappelez-vous) suffisamment complexe pour qu'il ne corresponde pas d'une manière ou d'une autre à votre application.
Knuth en parle.
- Réponses précédentes
- Plus de réponses