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 :

Création d'une liste de n termes aléatoires, chaque termes sont distincts deux à deux.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    essaie encore de faire son Dm d'info mais à fini par faire la question 1 à l'aide de gens sympathik
    Inscrit en
    Avril 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : essaie encore de faire son Dm d'info mais à fini par faire la question 1 à l'aide de gens sympathik

    Informations forums :
    Inscription : Avril 2020
    Messages : 4
    Par défaut Création d'une liste de n termes aléatoires, chaque termes sont distincts deux à deux.
    Bonjour,
    je suis nouveau sur le forum, excusez moi si je ne respecte pas certaines règles, je ne sais même pas si je suis au bon endroit pour poster ça.
    Voilà le problème :

    Je veux créer une fonction qui prend deux entiers positifs ou nuls en argument et qui me renvoie un tableau de n lignes et à deux colonnes. (Chaque ligne correspond à une coordonnée). Chaque ligne est aléatoire et unique dans le tableau (elles sont toutes différentes)

    J'ai cherché longtemps et je suis passé par différentes fonctions mais voilà celle que je trouvais la meilleure. Quand je la fais fonctionner, il n'y a pas de message d'erreur mais le tableau généré contient souvent des lignes identiques. De toute évidence, la partie du code chargée de l'unicité des lignes ne fonctionne pas et je ne comprend pas comment régler le problème. Je comprend le problème mais je ne vois pas comment faire autrement...


    voilà le code de ma fonction, j'en ai fais un exemple pour n=4 et cmax=1 (il faut savoir que n représente le nombre de lignes (le nombre de coordonnées du tableau) et que cmax représente le maximum des coordonnées.) Il me semble qu'il faut une condition sur les arguments pour que la boucle while ne tourne pas indéfiniment. (n<=(cmax+1)**(cmax+1)
    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
    26
     
    from math import *
    import numpy as np
    from random import *
     
     
     
    # la fonction qui permet d'obtenir la liste
    def GPI( n, cmax):
     
        pi=[]
        for i in range (n):                 # boucle qui va générer la termes aléatoire de la suite 
            a=randint(0,cmax)
            b=randint(0,cmax)
            C=[a,b]
            for t in range(i):              # boucle censé vérifier que le terme générer n'est pas déjà dans la suite, c'est la partie qui foire... 
                if C==pi[t] :
                    k=0
                    while C==pi[t] :        # s'il y est alors on regénère le terme jusqu'à ce qu'il soit différent de tous les autres 
                        c=randint(0,cmax)
                        d=randint(0,cmax)
                        C=[c,d]
            pi.append(C)                    
        PI=np.array(pi)                     # création d'un tableau
        return PI
    print(GPI(4,1))
    # cela affiche un tableau avec 4 lignes différentes, mais aussi parfois avec deux lignes identiques. par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [[0,0]
     [1,1]
     [1,0]
     [0,0]]
    il y a deux lignes identiques ça va pas.

    est-ce que quelqu'un peut m'aider en me montrant un code qui marche s'il vous plaît ?

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Pour fabriquer une liste de N couples d'entiers différents, vous avez 2 possibilités:
    - fabriquer tous les couples, les mélanger avec random.shuffle et prendre les N premiers,
    - fabriquer un couple tant qui est présent dans la liste avant de l'ajouter (s'optimise avec des "set").

    Vous avez choisi la 2ème solution. Si elle ne fonctionne pas c'est qu'une fois que vous avez trouvé un couple existant, vous testez le nouveau couple avec celui ci au lieu de retester toute la liste.

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

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Ton code est bien compliqué. Tu aurais utilisé "tant que couple in tableau alors regénérer couple"...

    Mais bon même pas besoin. Avec un "set()" ça va assez vite. En effet, il ne peut avoir que des éléments différents. Si on lui rajoute un élément déjà existant, l'instruction est ignorée.

    Donc tu peux faire
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tab=set()
    while len(tab) < n:
    	tab.add(tuple(random.randint(1, cmax) for i in range(2)))
    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]

  4. #4
    Futur Membre du Club
    Homme Profil pro
    essaie encore de faire son Dm d'info mais à fini par faire la question 1 à l'aide de gens sympathik
    Inscrit en
    Avril 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : essaie encore de faire son Dm d'info mais à fini par faire la question 1 à l'aide de gens sympathik

    Informations forums :
    Inscription : Avril 2020
    Messages : 4
    Par défaut
    ah, je ne connaissais pas set(), je viens de regarder et je crois comprendre votre code, effectivement il est un peu plus court x). Par contre, est-ce que set() se trouve dans la bibliothèque numpy ?

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pantoufles Voir le message
    Avant de poster ma question précédente j'ai essayé plusieurs fois de trouver un moyen de tester la liste entière mais je n'ai pas réussi et je n'ai plus d'idée pour le faire. j'ai notamment essayé avec l'instruction "C in pi" mais sans succès, puis sont apparus de plus en plus en problèmes puis c'est devenu trop complexe. Je suis persuadé que ça n'a rien de compliqué mais je suis perdu. Auriez-vous une piste de code afin de m'éclairer sur la manière de coder cela ?
    Pourtant c'était là la solution
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    tab=[]
    while len(tab) < n:
    	(a, b)=(random.randint(1, cmax) for i in range(2))
    	if (a, b) not in tab: tab.append((a, b))
    # while
    Ensuite bon, puisque Python possède un outil qui fait déjà le job de checker la duplication...

    Citation Envoyé par Pantoufles Voir le message
    Par contre, est-ce que set() se trouve dans la bibliothèque numpy ?
    set() est du standard Python.
    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]

  6. #6
    Futur Membre du Club
    Homme Profil pro
    essaie encore de faire son Dm d'info mais à fini par faire la question 1 à l'aide de gens sympathik
    Inscrit en
    Avril 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : essaie encore de faire son Dm d'info mais à fini par faire la question 1 à l'aide de gens sympathik

    Informations forums :
    Inscription : Avril 2020
    Messages : 4
    Par défaut
    Merci d'avoir répondu,
    j'ai compris pourquoi ça ne fonctionnait pas. Avant de poster ma question précédente j'ai essayé plusieurs fois de trouver un moyen de tester la liste entière mais je n'ai pas réussi et je n'ai plus d'idée pour le faire. j'ai notamment essayé avec l'instruction "C in pi" mais sans succès, puis sont apparus de plus en plus en problèmes puis c'est devenu trop complexe. Je suis persuadé que ça n'a rien de compliqué mais je suis perdu. Auriez-vous une piste de code afin de m'éclairer sur la manière de coder cela ?

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par Pantoufles Voir le message
    Auriez-vous une piste de code afin de m'éclairer sur la manière de coder cela ?
    La méthode proposée par Sve@r avec des "set" est un peu avancée, mais vous pouvez utiliser des constructions plus basiques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from random import randint
     
    L = []
    while len(L) < 5:
        C = (randint(0, 10), randint(0, 10))
        if C not in L:
            L.append(C)
     
    print (L)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Futur Membre du Club
    Homme Profil pro
    essaie encore de faire son Dm d'info mais à fini par faire la question 1 à l'aide de gens sympathik
    Inscrit en
    Avril 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : essaie encore de faire son Dm d'info mais à fini par faire la question 1 à l'aide de gens sympathik

    Informations forums :
    Inscription : Avril 2020
    Messages : 4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    La méthode proposée par Sve@r avec des "set" est un peu avancée, mais vous pouvez utiliser des constructions plus basiques:


    - W
    D'accord merci beaucoup pour votre réponse, ça m'a permis d'avancer.

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

Discussions similaires

  1. Réponses: 33
    Dernier message: 30/10/2016, 11h03
  2. [Batch] Création d'une liste aléatoire en parcourant un fichier *.M3U
    Par LinTianFu dans le forum Scripts/Batch
    Réponses: 12
    Dernier message: 20/10/2016, 14h50
  3. [generic] pb création d'une List []
    Par yoplaboom dans le forum Langage
    Réponses: 6
    Dernier message: 08/07/2005, 13h01
  4. Création d'une liste ...
    Par keryss dans le forum Access
    Réponses: 6
    Dernier message: 21/10/2004, 09h00

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