Dans mon programme, je dois exécuter N threads séparés chacun avec leur propre RNG qui est utilisé pour échantillonner un grand ensemble de données. J'ai besoin de pouvoir semer tout ce processus avec une seule valeur afin de pouvoir reproduire les résultats.
Suffit-il d'augmenter simplement séquentiellement le germe pour chaque indice?
Actuellement , j'utilise numpy
« s RandomState
qui utilise un générateur de nombres pseudo-aléatoires Mersenne Twister.
Extrait de code ci-dessous:
# If a random number generator seed exists
if self.random_generator_seed:
# Create a new random number generator for this instance based on its
# own index
self.random_generator_seed += instance_index
self.random_number_generator = RandomState(self.random_generator_seed)
Essentiellement, je commence par une graine entrée par l'utilisateur (si elle existe) et pour chaque instance / thread, j'ajoute séquentiellement l'index (0 à N-1) de l'instance en cours d'exécution. Je ne sais pas s'il s'agit d'une bonne pratique ou s'il existe une meilleure façon de procéder.
Réponses:
Ce n'est certainement pas une excellente pratique. Par exemple, considérez ce qui se passe lorsque vous effectuez deux exécutions avec des racines racines 12345 et 12346. Chaque exécution aura des
N-1
flux en commun.Les implémentations de Mersenne Twister (y compris
numpy.random
etrandom
) utilisent généralement un PRNG différent pour étendre la graine entière dans le vecteur à grand état (624 entiers 32 bits) que MT utilise; c'est le tableau deRandomState.get_state()
. Un bon moyen de faire ce que vous voulez est d'exécuter ce PRNG, ensemencé avec votre entier d'entrée une fois, et d'en obtenirN*624
des entiers 32 bits. Divisez ce flux enN
vecteurs d'état et utilisezRandomState.set_state()
pour initialiser explicitement chaqueRandomState
instance. Vous devrez peut-être consulter les sources C denumpy.random
ou à_random
partir de la bibliothèque standard pour obtenir ce PRNG (ce sont les mêmes). Je ne sais pas si quelqu'un a implémenté une version autonome de ce PRNG pour Python.la source
RandomState
implémentations les plus récentes en développement qui utilise un algorithme qui a des flux configurables. Autrement dit, vous initialisez chaqueRandomState
instance avec la même graine et différents ID de flux (simplement incrémenté, c'est bien), et vous avez la garantie de flux indépendants. pypi.python.org/pypi/randomstatela source
Il existe maintenant un package Python appelé RandomGen qui a des méthodes pour y parvenir.
Il prend en charge les flux indépendants créés à partir d'une seule graine, ainsi qu'un protocole de saut pour les anciens générateurs de nombres aléatoires tels que MT19937.
la source
Certaines personnes affirment qu'il existe des corrélations dans les nombres aléatoires générés par les graines séquentielles. /programming/10900852/near-seeds-in-random-number-generation-may-give-similar-random-numbers Je ne sais pas si c'est vrai.
Si cela vous inquiète, pourquoi ne pas utiliser un seul générateur de nombres aléatoires pour choisir les graines de tous les autres générateurs?
la source