Vous avez déjà fait de nombreuses observations correctes!
À moins que vous ne souhaitiez amorcer les deux générateurs aléatoires, il est probablement plus simple à long terme de choisir un générateur ou l'autre. Mais si vous devez utiliser les deux, alors oui, vous devrez également les semer tous les deux, car ils génèrent des nombres aléatoires indépendamment les uns des autres.
Car numpy.random.seed()
, la principale difficulté est qu'il n'est pas thread-safe - c'est-à-dire qu'il n'est pas sûr à utiliser si vous avez de nombreux threads d'exécution différents , car il n'est pas garanti de fonctionner si deux threads différents exécutent la fonction en même temps. Si vous n'utilisez pas de threads, et si vous pouvez raisonnablement vous attendre à ce que vous n'ayez pas besoin de réécrire votre programme de cette façon à l'avenir, cela numpy.random.seed()
devrait aller. S'il y a une raison de soupçonner que vous pourriez avoir besoin de threads à l'avenir, il est beaucoup plus sûr à long terme de faire comme suggéré et de créer une instance locale de la numpy.random.Random
classe . Autant que je sache, random.random.seed()
est thread-safe (ou du moins, je n'ai trouvé aucune preuve du contraire).
La numpy.random
bibliothèque contient quelques distributions de probabilités supplémentaires couramment utilisées dans la recherche scientifique, ainsi que quelques fonctions pratiques pour générer des tableaux de données aléatoires. La random.random
bibliothèque est un peu plus légère et devrait convenir si vous ne faites pas de recherche scientifique ou d'autres types de travail en statistique.
Sinon, ils utilisent tous les deux la séquence de torsions de Mersenne pour générer leurs nombres aléatoires, et ils sont tous deux complètement déterministes - c'est-à-dire que si vous connaissez quelques informations clés, il est possible de prédire avec une certitude absolue le nombre qui suivra . Pour cette raison, ni numpy.random ni random.random ne conviennent à des utilisations cryptographiques sérieuses . Mais comme la séquence est très très longue, les deux sont parfaits pour générer des nombres aléatoires dans les cas où vous ne craignez pas que les gens essaient de procéder à une ingénierie inverse de vos données. C'est aussi la raison pour laquelle il est nécessaire de semer la valeur aléatoire - si vous commencez au même endroit à chaque fois, vous obtiendrez toujours la même séquence de nombres aléatoires!
Comme une note de côté, si vous avez besoin de niveau cryptographique aléatoire, vous devez utiliser le secret module, ou quelque chose comme Crypto.Random si vous utilisez une version Python plus tôt que Python 3.6.
random.random
seules. Cependant, vous n'en avez généralement pas besoin.À partir de Python pour l'analyse des données , le module
numpy.random
complète Pythonrandom
avec des fonctions permettant de générer efficacement des tableaux entiers de valeurs d'échantillons à partir de nombreux types de distributions de probabilités.En revanche, le
random
module intégré de Python n'échantillonne qu'une seule valeur à la fois, alors qu'ilnumpy.random
peut générer un très grand échantillon plus rapidement. En utilisant la fonction magique d'IPython,%timeit
on peut voir quel module fonctionne le plus rapidement:la source
np.random.randint(2)
àrandom.randrange(2)
et NumPy était plus lent . NumPy: 1,25 us et aléatoire: 891 ns. Et aussi la même relation pournp.random.rand()
etrandom.random()
.La source de la graine et le profil de distribution utilisé vont affecter les sorties - si vous recherchez le caractère aléatoire cryptographique, l'amorçage à partir de os.urandom () obtiendra presque de vrais octets aléatoires à partir du bavardage de l'appareil (c'est-à-dire Ethernet ou disque) (ie / dev / aléatoire sur BSD)
cela vous évitera de donner une graine et donc de générer des nombres aléatoires déterministes. Cependant, les appels aléatoires vous permettent ensuite d'ajuster les nombres à une distribution (ce que j'appelle le hasard scientifique - finalement tout ce que vous voulez est une distribution en courbe en cloche de nombres aléatoires, numpy est le meilleur pour résoudre cela.
Alors oui, restez avec un seul générateur, mais décidez quel aléatoire vous voulez - aléatoire, mais sans aucun doute à partir d'une courbe de distrubtuion, ou aussi aléatoire que vous pouvez obtenir sans dispositif quantique.
la source