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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    août 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 41
    Points : 30
    Points
    30
    Par défaut Remplir une matrice avec une suite numérique avec positonnement au hasard
    Bonsoir

    J'ai une matrice de n lignes par m colonnes (variables : rows et columns)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = [[10] * columns for i in range(rows)]
    Ce qui me donne un grid du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    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   
    0    0    0    0    0    0


    j'ai une suite numérique stockée dans une liste de façon aléatoire.
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l = list(random.sample(range(500, 800,2), len(range(500,800,2))))

    Je tente de remplir la matrice avec les données de cette suite numérique de manière aléatoire avec cette contrainte : la première case est placée au hasard, les autres sont adjacentes avec un coté commun (pas une arête)


    Je tire donc une case au hasard de la matrice que je remplis avec le 1er élement de la liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    randomColumns = random.randrange(columns)
    randomRows = random.randrange(rows)
     
    # On place un nombre au hasard dans le tableau
    posListe = 0
    a[randomRows][randomColumns] = l[posListe]

    Depuis cette case, j'essaie de simuler un parcours au hasard en me basant sur un tuple contenant 2 éléments (déplacement horizontal ou vertical et avance ou recule)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    choix = ((-1,1),('avColumns','avRows'))
    que je récupère de avec un random.choice

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    avanceColOrRow = random.choice(choix[1])
    avance = random.choice(choix[0])
    Puis pour la case suivante,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if avanceColOrRow == 'avColumns':
    	# Je teste si proche du bord
            if randomColumns == 0 :
            	avance = 1
            	print('COLUMNS 0')
       	 elif randomColumns == columns -1:
            	avance = -1
            	print("COLUMNS -1")
        	else:
            	avance = random.choice(choix[0])
            	print("COLUMN Avance : : "  + str(avance) )
    Et aussi je réalise le test si c'est avRows qui est sorti


    J'ai en parallèle également un tableau à une entrée pour mettre les cases déjà parcourues
    Je compare ces cases à la case sortie du test précédent. SI elle figure déjà dans le tableau, je recommence, sinon j'incremente le tableau et avance à la nouvelle position


    J'ai un compteur aussi pour le nombre de test. Au bout de 6 fois de la même stratégie, je sors de la boucle et retente mais chance

    Le hic, c'est que ça marche très mal.


    En fait je voudrais avoir au final un grid ainsi (avec un serpentin de la suite numérique), ce cheminement serait remodelé à chaque nouveau lancement du script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    0    0    0    0    0    0   
    70   75   80   85   90   0   
    65   0    5    0    95   100   
    60   0    10   15   0    0   
    55   50   0    20   0    0   
    0    45   0    25   0    0   
    0    40   35   30   0    0   
    0    0    0    0    0    0

    Mais je doute fortement de mon algorithme


    AUriez vous des conseils pour y parvenir ? Peut être des modules existent ils ou alors mon approche est très mauvaise. Même que des mots clefs pour aider à affiner mes recherches sont les bienvenus.

    D'avance merci,

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    8 965
    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 : 8 965
    Points : 24 571
    Points
    24 571
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par cyrille_b Voir le message
    Le hic, c'est que ça marche très mal.
    C'est un peu normal. Tu es en train de recréer le nibble (le serpent qui grandit au fur et à mesure qu'il avance) et tel nibble, en avançant au hasard tu te retrouves coincé dans des cul de sac créés par ton corps.

    Citation Envoyé par cyrille_b Voir le message
    AUriez vous des conseils pour y parvenir ?
    Ben... la seule façon de tout remplir sans se mordre la queue est le cheminement linéaire. J'avance jusqu'au bout, puis je fais demi-tour et refais le chemin inverse sur la ligne suivante. Et si tu as commencé au milieu, alors tu dois laisser la dernière colonne de libre pour, une fois que tu auras tout rempli la partie haute (ou basse) de ton terrain tu puisses ensuite rejoindre l'autre partie.
    Ou alors l'approche serpentin. Mais en laissant le hasard décider, tu arriveras fatalement sur une configuration cul de sac.

    Et ceci n'est pas un souci Python mais un souci d'algo donc qui aurait dû se trouver dans la partie adéquate du forum.

    Citation Envoyé par cyrille_b Voir le message
    Même que des mots clefs pour aider à affiner mes recherches sont les bienvenus.
    Tente "nibble" avec "algorithme"...

    Citation Envoyé par cyrille_b Voir le message
    Et aussi je réalise le test si c'est avRows qui est sorti
    Ah là ça devient du Python car tu testes une string (super long) alors qu'il y avait tellement de façons plus adéquates. Par exemple tu aurais fait un choix sur ((-1, 0), (0, -1), (1, 0), (0, 1)) tu avais directement ton déplacement en x ou en y sans avoir à tester quoi que ce soit. Tu pouvais aussi choisir sur ((1, 0), (0, 1)) d'un côté et (1, -1) de l'autre et tu multipliais le premier par le second ça le faisait aussi.
    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

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    août 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 41
    Points : 30
    Points
    30
    Par défaut
    Merci pour la réponse.
    Désolé pour le post au mauvais endroit

    Par contre, je ne veux pas un cheminement linéaire, justement je voudrais un cheminement "plus aléatoire".
    Par contre je vais me replonger dans ta proposition de déplacement en fonction des 4 paramètres.

    Merci, je recreuse

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    8 965
    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 : 8 965
    Points : 24 571
    Points
    24 571
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cyrille_b Voir le message
    Par contre, je ne veux pas un cheminement linéaire, justement je voudrais un cheminement "plus aléatoire".
    Ben oui mais si on peut pas, on peut pas.
    Tu peux aussi voir du côté de algorithme de remplissage...
    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

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    août 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 41
    Points : 30
    Points
    30
    Par défaut
    OK si vais lire cela attentivement et essayer de trouver une alternative viable
    En tout cas merci d'avoir pris le temps de me lire et pour les éléments de réponses.

Discussions similaires

  1. [Python 3.X] matrice avec entier au hasard
    Par ilaomxp dans le forum Général Python
    Réponses: 7
    Dernier message: 14/11/2019, 09h21
  2. Réponses: 23
    Dernier message: 02/05/2018, 23h03
  3. Regex pour une suite numérique.
    Par psk75 dans le forum Langage
    Réponses: 2
    Dernier message: 21/06/2011, 15h54
  4. Réponses: 6
    Dernier message: 10/01/2009, 21h18
  5. Numéro manquant d'une suite numérique
    Par afrodje dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/11/2008, 17h45

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