IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Probleme avec Random.choice dans une liste avec éléments identiques


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Par défaut Probleme avec Random.choice dans une liste avec éléments identiques
    Bonjour à tous (et meilleurs vœux 2x20),
    Dans le cadre d'un exercice, je faire une petite simulation d'une salle d'attente constituée d'une rangée de n sièges tous identiques. Un siège "0" signifie qu'il est libre, un siège "1" signifie qu'il est occupé. La rangée de sièges est définie par une liste de n éléments 0 et 1.
    Parmi les tâches que je dois programmer , il est en une qui doit simuler le choix au hasard d'un siège et le tester pour savoir s'il est libre ou pas pour pouvoir l'occuper. Pour cela j'utilise l'instruction random.choice(Rangee) mais je m'aperçoit que dés au moins deux éléments de la liste sont identique, la choix "aléatoire" ne se fait plus … le même siège est toujours choisi.

    Pour illustrer cette anomalie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import random
    Rangee=range(0,6)
    print Rangee
    for i in range(0,10):
        a=random.choice(Rangee)
        print a
        print Rangee.index(a)
    Là OK, j'ai bien un tirage au hasard. Mais dés que la liste présente deux éléments identiques ou plus , par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import random
    Rangee=[0, 1, 0, 1, 0, 0]
    print Rangee
    for i in range(0,10):
        a=random.choice(Rangee)
        print a
        print Rangee.index(a)
    Là NON OK: seuls les deux premiers sièges de la liste sont choisis (cela est vu en affichant le rang du siège choisi).

    Pourriez vous m'éclairer sur cette anomalie (si cela en est une !) et comment devrais-je modifier l'instruction pour que le choix aléatoire se fasse sur la liste entière.
    Merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Salut,

    Prenez un dé à 6 faces numérotées de 1 à 6 avec les faces 2, 3, 4, 5 sont blanches et les faces 1, 6 sont noires.
    Quelle est la probabilité de tirer une face noire? 2/6.
    Quel est le plus petit numéro d'une face noire? 1 et ce numéro ne changera pas même si c'est la face noire n°6 qui sort.

    Pour vos listes, c'est pareil: vous confondez la couleur et l'indice du premier élément de la liste ayant cette couleur.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Par défaut Probleme avec Random.choice dans une liste avec éléments identiques
    Bonjour,

    Notée la consigne quant au code à insérer entre balises.

    J'ai bien compris l'image du dé utilisée pour expliquer le calcul des probabilités.
    Dans mon cas de figure les sièges sont symbolisés par des 0 et des 1 que je veux considérer comme tous indépendants. La liste pouvant être de taille variable n , qui sera définie par l'utilisateur. Mon problème est donc: comme gérer tous les éléments de la liste de manière indépendante même s'ils ont des états (libres/occupés) identiques

    Merci
    christian

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Citation Envoyé par chalvron Voir le message
    Dans mon cas de figure les sièges sont symbolisés par des 0 et des 1 que je veux considérer comme tous indépendants.
    En disant cela vous vous foutez dedans.

    Les sièges sont numérotés de 1 à n.
    Ce qui correspond à différentes positions/index dans une liste.
    Et c'est la valeur (0 ou 1) à cette position qui indique libre/occupé.

    Imaginez une fonction f de l'intervalle 1..n vers { 0, 1 }.
    L'ensemble de départ n'est pas l'ensemble d'arrivée... et votre liste est juste une représentation de cette fonction.

    Choisir un des entiers de 1..n pour lesquels f vaut 0, c'est construire l'ensemble des k de 1..n tels que f(k) = 0 (pour s'assurer qu'il n'est pas vide) et choisir un de ses éléments.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut


    Un peu d'aide, à vous de comprendre et de vous approprier le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    from random import randint
     
     
    def assoir(lst):
        # s'il reste au moins une place vide
        if sum(lst) < len(lst):
            # trouver une chaise vide et s'assoir
            while True:
                # indice d'une chaise au hasard
                indice = randint(0, len(lst)-1)
                # debug, indice et état de la chaise : 0 ou 1
                print(indice, lst[indice])
                # chaise vide ?
                if lst[indice] == 0:
                    lst[indice] = 1
                    break
        return lst
     
    # état des sièges au départ de l'action
    lst = [0, 0, 1, 0, 0, 1, 1, 0, 1]
     
    # faire s'assoir 3 personnes
    for k in range(0, 3):
        lst = assoir(lst)
        print(lst)

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 837
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 837
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chalvron Voir le message
    Bonjour à tous (et meilleurs vœux 2x20),
    Bonsoir. Bonne année à toi.

    Citation Envoyé par chalvron Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Rangee=[0, 1, 0, 1, 0, 0]
        a=random.choice(Rangee)
        print a
        print Rangee.index(a)
    Là NON OK: seuls les deux premiers sièges de la liste sont choisis (cela est vu en affichant le rang du siège choisi).
    La fonction "index()" retourne la première position contenant la valeur cherchée. Autrement dit, peut-être que ton random() t'a donné le 5° "0", mais ensuite index(0) te dit que que "0" se trouve en position "0" ce qui est vrai

    Modifie un peu "Rangee" et donne lui une liste de tuples contenant une valeur et sa position et tu verras que random() les prend vraiment au hasard (ex Rangee=((0, 0), (1, 1), (0, 2), (1, 3), (0, 4), (0, 5)))...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Tire au hasard une position de siège. La position t'indique de manière unique et sans ambiguité de quel siège il s'agit précisément. Par contre si tu as juste l'info libre ou occupé, tu n'as aucun moyen de savoir de quel siège exactement il s'agit. Et index dans ce cas, renvoit le premier qu'il trouve dans cet état, donc toujours le meme, qui n'est pas forcément (voire très rarement) celui qui a été tiré au sort ...

  8. #8
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Par défaut
    Bonjour

    Merci à tous pour vos réponses.
    En fait, ce que j'en conclue est que le choix au hasard d'un siège se fait par rapport à son position (index via randint) car on est sûr que sa position est unique contrairement à son statut 0 / 1 . La fonction f(index) vers {0,1} n'étant pas bijective.

    @plus

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 837
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 837
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chalvron Voir le message
    En fait, ce que j'en conclue est que le choix au hasard d'un siège se fait par rapport à son position (index via randint) car on est sûr que sa position est unique
    Il y a plusieurs façons de résoudre ce problème. Tu peux effectivement tirer la position au hasard et recommencer tant que le siège tiré n'est pas libre. Tu peux aussi ranger la liste des positions libres dans un autre tableau et tirer ensuite une position au hasard depuis ce second tableau (et avec les listes en intension ce second tableau peut même être créé "à la volée"). Et probablement encore d'autres façons.

    Citation Envoyé par chalvron Voir le message
    La fonction f(index) vers {0,1} n'étant pas bijective.
    Hé oui. L'info que tu as reçu de cette fonction ne permet pas d'en déduire quoi que ce soit à propos du siège tiré
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/09/2018, 21h26
  2. Réponses: 7
    Dernier message: 30/04/2010, 10h48
  3. Réponses: 2
    Dernier message: 21/02/2007, 13h28
  4. Réponses: 3
    Dernier message: 26/08/2006, 14h03
  5. Réponses: 2
    Dernier message: 10/10/2005, 02h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo