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.