J'essaie de créer une fonction qui prend deux listes et sélectionne un élément au hasard dans chacune d'elles. Existe-t-il un moyen de le faire en utilisant la fonction random.seed?
3 réponses
Vous pouvez utiliser random.choice
pour sélectionner un élément aléatoire dans un séquence (comme une liste).
Si vos deux listes sont list1
et list2
, ce serait:
a = random.choice(list1)
b = random.choice(list2)
Voulez-vous vraiment utiliser random.seed
? Cela initialisera le générateur de nombres aléatoires de manière cohérente à chaque fois, ce qui peut être très utile si vous voulez que les exécutions suivantes soient identiques mais en général ce n'est pas souhaité. Par exemple, la fonction suivante retournera toujours 8, même s'il semble qu'elle devrait choisir au hasard un nombre entre 0 et 10.
>>> def not_very_random():
... random.seed(0)
... return random.choice(range(10))
...
>>> not_very_random()
8
>>> not_very_random()
8
>>> not_very_random()
8
>>> not_very_random()
8
J'ai refait totalement ma réponse précédente. Voici une classe qui encapsule un générateur de nombres aléatoires (avec graine optionnelle) avec la liste. Il s'agit d'une amélioration mineure par rapport à celle de F.J., car elle donne un comportement déterministe pour les tests. L'appel de choice()
sur la première liste ne devrait pas affecter la deuxième liste, et vice versa:
class rlist ():
def __init__(self, lst, rg=None, rseed=None):
self.lst = lst
if rg is not None:
self.rg = rg
else:
self.rg = random.Random()
if rseed is not None:
self.rg.seed(rseed)
def choice(self):
return self.rg.choice(self.lst)
if __name__ == '__main__':
rl1 = rlist([1,2,3,4,5], rseed=1234)
rl2 = rlist(['a','b','c','d','e'], rseed=1234)
print 'First call:'
print rl1.choice(),rl2.choice()
print 'Second call:'
print rl1.choice(),rl2.choice()
Remarque: la solution de @ F.J est beaucoup moins compliquée et meilleure.
Utilisez random.randint
pour choisir un index pseudo-aléatoire dans la liste. Utilisez ensuite cet index pour sélectionner l'élément:
>>> import random as r
>>> r.seed(14) # used random number generator of ... my head ... to get 14
>>> mylist = [1,2,3,4,5]
>>> mylist[r.randint(0, len(mylist) - 1)]
Vous pouvez facilement l'étendre pour travailler sur deux listes.
Pourquoi voulez-vous utiliser random.seed
?
Exemple (en utilisant Python2.7):
>>> import collections as c
>>> c.Counter([mylist[r.randint(0, len(mylist) - 1)] for x in range(200)])
Counter({1: 44, 5: 43, 2: 40, 3: 39, 4: 34})
Est-ce assez aléatoire?
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.