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

Langage Perl Discussion :

débutante Perl : remplir un tableau avec des entiers aléatoirement distincts


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Points : 9
    Points
    9
    Par défaut débutante Perl : remplir un tableau avec des entiers aléatoirement distincts
    Bonjour ,

    je viens de commencer à faire du perl (1er exos) ,
    et ce que j'aimerai c'est d'écrire une sous-routine , me permettant de remplir un tableau de taille 100 par exemple , avec des entiers aléatoires . jusqu'ici j'arrive à le faire , mon problème c'est que je veux tous les éléments du tableau soient différents , alors là je met un petit test dans ma sous-routine pour remplir le tableau comme désiré , mais plus rien ne marche .
    quelqu'un pourrait il m'aider ?



    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
    27
    28
    #!/usr/bin/perl 
     
     
    #$essaie = 10;
     
    sub random_array{
     
    # for ( $i=0 ; $i<10; $i++){
     
    # $array[$i]= int(rand 10)+1;
     
    # }
    for ($i=0 ; $i<10 ; $i++){
     
    $array[$i]= int(rand 10)+1;
    for ($j=1 ; $j<10 ;$j++){
    do { 
    $array[$i]= int(rand 10)+1;
    }while($array[$i]==$array[$j])
     
    }
    print " Voici le tableau de nombres alatoires @array \n ";
    } 
     
    # print " Voici le tableau de nombres alatoires @array \n ";
    }
     
    &random_array;

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    le principe a mettre en oeuvre ici serait (en algo)

    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
    indiceTableau = 0;
    boucle
      x = random;
      trouvé = faux;
     
      # recherche si x est déjà dans le tableau
      pour i allant de 0 a indiceTableau
        Si (tableau[i] == x) alors 
             trouvé = vrai
             Sortir de la boucle pour
         finsi
      finpour 
     
      # si x n'est pas dans le tableau alors on l'insère
      si (trouve == faux)  alors
        tableau[indiceTableau] = x
        indiceTableau = indiceTableau + 1
      finsi
     
      si (indiceTableau == 100) Sortir de la boucle
    finboucle
    Autrement il faut être certains que le nombre de valeur générée par rand est plus grand que la taille du tableau sinon tu as un boucle infinie.

  3. #3
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Une approche alternative qui marche pas mal, c'est de générer une suite strictement croissante de nombre aléatoires (par exemple en se contentant d'ajouter un nombre aléatoire non-nul au dernier élément ajouté à la liste) dont on est ainsi sûr qu'ils sont bien distincts, puis de mélanger (cf shuffle de List::Util). Ca a l'avantage d'être en O(n) contrairement au O(n²) de l'approche de jabbounet (on peut l'améliorer en utilisant un hash mais contre une grosse utilisation mémoire).

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    use List::Util qw/shuffle/;
     
    sub random_array {
      my( $num_elts, $increase_limit ) = @_;
     
      my @arr = (0) x $num_elts;
      my $rnum = 0;
      for( my $i = 0; $i < $num_elts; $i++ ) {
        $rnum += int(rand $increase_limit + 1);
        $arr[$i] = $rnum;
      }
     
      return shuffle(@arr);
    }
    --
    Jedaï

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 16
    Points : 9
    Points
    9
    Par défaut tableau de taille fixe ou variable perl
    bonjour ,

    merci pour vos reponses .

    une autre question que j'ai c'est que : comment j'ai envie de creer un tableau de taille fixe ou variable , le tableau au départ est vide , comment est ce je déclare cela ?????
    je peux faite par exemple:

    @newtab = ();
    mais pour la taille comment je procède?

    merci

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Tu n'as pas vraiment à te soucier de la taille, elle s'arrange automatiquement en fonction des ajouts que tu y fait à la fin, soit en utilisant push, soit en utilisant l'indice du dernier élément. Toutes les lignes suivantes sont équivalentes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    push @table, $nombre;
    $table[$#table+1] = $nombre;
    $table[@table] = $nombre;
    Mais comme Jedai le fait dans son exemple, tu peux aussi "définir" ta table avec des valeurs initiales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @table = (0) x $taille_table;
    Au passage, j'apprends que l'opérateur x a un usage dans un contexte de liste que je ne connaissais pas... merci Jedai

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

Discussions similaires

  1. Remplir un tableau avec des images
    Par KingNaab dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 10/05/2013, 23h08
  2. Remplir un tableau avec des données d'une autre feuille
    Par nomade333 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/04/2012, 12h17
  3. Remplir un tableau avec des variables
    Par Super_carotte dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 10/06/2010, 09h22
  4. remplir un tableau avec des références à plusieurs feuilles
    Par Amiral19 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 22/07/2007, 22h26
  5. Réponses: 8
    Dernier message: 11/03/2007, 18h10

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