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?

4
Brandon Bosso 1 déc. 2011 à 22:02

3 réponses

Meilleure réponse

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
21
Andrew Clark 1 déc. 2011 à 18:12

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()
-1
smci 21 oct. 2013 à 05:36

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?

1
3 revs 1 déc. 2011 à 18:32
8346067