Python's random: Que se passe-t-il si je n'utilise pas de graines (someValue)?
Question
a) Dans ce cas, le générateur de nombres aléatoires utilise-t-il l'horloge du système (effectuant le changement de graine) à chaque exécution?
b) La graine est-elle utilisée pour générer les valeurs pseudo-aléatoires de expovariate (lambda)?
La solution
"Utilisez la source, Luke!" ... ;-). Étude de https://svn.python.org/projects/python/trunk /Lib/random.py va rapidement vous rassurer; -).
Que se passe-t-il lorsque la graine n'est pas définie (c'est le cas "i is None"):
if a is None:
try:
a = long(_hexlify(_urandom(16)), 16)
except NotImplementedError:
import time
a = long(time.time() * 256) # use fractional seconds
et l'expovarié:
random = self.random
u = random()
while u <= 1e-7:
u = random()
return -_log(u)/lambd
utilise évidemment le même générateur aléatoire sous-jacent que toutes les autres méthodes, et est donc affecté de manière identique par l'ensemencement ou son absence (en réalité, comment aurait-il été fait autrement? -)
Autres conseils
a) Il utilise généralement l'horloge système. Sur certains systèmes, celle-ci peut n'être que de précision ms. Par conséquent, le double déclenchement très rapide peut donner la même valeur.
graine (soi, a = Aucun) Initialise l’état interne de l’objet hashable.
None or no argument seeds from current time or from an operating system specific randomness source if available.
b) J'imagine que l'expovarié le fait, mais je ne trouve aucune preuve. Ce serait idiot si ce n’était pas le cas.
l'heure système actuelle est utilisée; l'heure système actuelle est également utilisée pour initialiser le générateur lors de la première importation du module. Si des sources aléatoires sont fournies par le système d'exploitation, elles sont utilisées à la place de l'heure système (voir la fonction os.urandom () pour plus de détails sur la disponibilité).