Mélanger avec une valeur fixe pour aléatoire
NE fonctionne PAS bien! Exemple:
from random import shuffle
v = sum([[k] * 100 for k in range(10)], [])
print v[:40]
shuffle(v, random = lambda: 0.7)
print v[:40]
Donne la sortie:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 8, 0, 0, 9, 0, 0, 0, 9, 0, 0, 8, 0, 0, 7, 0, 0, 0, 9, 0, 0, 7, 0, 0, 8, 0, 0, 0, 7, 0, 0, 7, 0, 0, 8, 0, 0, 0, 9]
C'est similaire pour d'autres graines - pas très aléatoire (à première vue de toute façon... difficile à prouver). C'est parce que aléatoire
n'est pas une graine - elle est réutilisée plusieurs fois. Démonstration:
def rand_tracker():
rand_tracker.count += 1
return random()
rand_tracker.count = 0
shuffle(v, random = rand_tracker)
print 'La fonction aléatoire a été appelée %d fois pour une liste de taille %d.' % (rand_tracker.count, len(v))
Qui montre:
La fonction aléatoire a été appelée 999 fois pour une liste de taille 1000.
Ce que vous devriez faire à la place, c'est la suggestion de @abarnert:
from random import Random
Random(4).shuffle(x)
Dans ce cas, une valeur fixe est parfaitement bonne.
TLDR : Utilisez la réponse de @abarnert, n'utilisez pas une fonction à valeur fixe pour aléatoire
!