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 :

extraction aléatoire d'un sous ensemble d'élements -> hash


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 57
    Points
    57
    Par défaut extraction aléatoire d'un sous ensemble d'élements -> hash
    Bonjour,
    Je souhaite à partir d'une liste de x élements, extraire de manière aléatoire y élements; ces y élements doivent être tous différents les uns des autres.

    Voilà comment je conçois mon script:
    Au 1 er tour, il choisit aléatoirement un 1er élement
    Au second tour, il chosit aléatoirement un 2nd élement sur les élements restants (il ne peux pas prendre l'élement choisi au 1er tour!)
    Au troisième tour, il choisi un 3ième élement sur les élements restant (il ne peux pas prendre l'élement choisi au 1er et 2nd tour!)
    Et ainsi de suite...

    Je joins mon script.
    - Dans mon exemple j'ai 7 élements et il me choisi que 4 élements au final. Pourquoi je ne peux pas en avoir 7?
    - Comment indiquer que je souhaite extraire seulement y élements de x?

    Pourriez vous m'aider?
    Merci par avance


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    mans	23	03
    big	01	01
    axe	12	11
    mad	03	11
    jim	23	01
    ble	15	11
    pont	02	02

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    my %hash=();
    my $i=0;
    my $j=0;
    my @liste_cle;
     
     
    open FILE, "test" or die $!;
     
    while(my $ligne = <FILE>){
            chomp $ligne;
            $i++;
     
    	my ($info,$date,$age) = split /\t/, $ligne; 
    	$hash{info}="$info"."\t"."$date"."\t"."$age";
     
    	# Obtenir la liste des clé du Hash
    	@liste_cle = keys( %hash );
     
     
    }
    print"la liste des clé du hash\n";
    print "@liste_cle \n";
     
    my $size = @liste_cle;
    print "nombre d'élements dans mon tableau :$size\n";
    print"\n";
     
     
    # Afficher les clés du Hash
    foreach my $mois (@liste_cle)
    {
            $j++;
            print "TOUR: $j\n";
     
    	#choix aléatoire d'une clé dans le tableau
    	my $choix = $liste_cle[rand @liste_cle];
     
    	print "***$choix\n";
     
    	#Afficher la valeur associé à la clé aléatoire
    	print "valeur associé à la clé aléatoire: ", $hash{$choix}, "\n"; 
     
    	if($choix) # Si le tirage existe
    	{
    		print "TIRAGE EXISTE\n";
    		delete($hash{$choix}); # On le supprime du hasH
     
    		print Dumper(\%hash);
                    @liste_cle = grep { $_ ne "$choix" } @liste_cle;		
     
    	}
     
    }

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Citation Envoyé par pontarose Voir le message
    - Dans mon exemple j'ai 7 éléments et il me choisi que 4 éléments au final. Pourquoi je ne peux pas en avoir 7?
    Tu boucles sur ta liste de clefs: foreach my $mois (@liste_cle) { (en passant, la variable $mois ne sert pas à grand chose.)
    Mais dans le corps de la boucle tu redéfinies @liste_cle avec un élément de moins: @liste_cle = grep { $_ ne "$choix" } @liste_cle;.
    Donc à l'index 0, il y a 7 éléments, à l'index 1 plus que 6, à l'index 2 plus que 5, et enfin à l'index 3 plus que 4. La fin de la liste est atteinte, il n'y a plus d'index 4, la boucle s'arrête après 4 tours.

    Citation Envoyé par pontarose Voir le message
    - Comment indiquer que je souhaite extraire seulement y éléments de x?
    Difficile de te répondre dans l'état actuel des choses, car ton code n'est pas encore fonctionnel. Tu devrais essayer une autre approche, par exemple en mélangeant une liste des lignes (List::Util::shuffle) pour créer un tableau dont tu ne prendrais que les y premiers éléments.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 57
    Points
    57
    Par défaut
    Merci CosmoKnacki pour ta réponse.

    Je comprend mieux!
    Voiçi mon noveau code : mon nombre d'élement final ($k) est aléatoire; cela dépend si il me sort un élement déjà utilisé ou pas!!

    Je vais regarder (List::Util::shuffle)

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    my %hash=();
    my $i=0;
    my $j=0;
    my $k=0;
    my @liste_cle;
     
     
    open FILE, "test" or die $!;
     
    while(my $ligne = <FILE>){
            chomp $ligne;
            $i++;
     
    	my ($info,$date,$age) = split /\t/, $ligne; 
    	$hash{info}="$info"."\t"."$date"."\t"."$age";
     
    	# Obtenir la liste des clé du Hash
    	@liste_cle = keys( %hash );
    }
    print"la liste des clé du hash\n";
    print "@liste_cle \n";
     
    my $size = @liste_cle;
    print "nombre d'élements dans mon tableau :$size\n";
    print"\n";
     
     
    # Afficher les clés du Hash
    foreach (@liste_cle)
    {
            $j++;
     
    	#choix aléatoire d'une clé dans le tableau
    	my $choix = $liste_cle[rand @liste_cle];
     
            if (exists $hash{$choix})
            {
    	       $k++;
    	       print "***$choix\n";
     
                   Afficher la valeur associé à la clé aléatoire
    	       print "valeur associé à la clé aléatoire: ", $hash{$choix}, "\n"; 
     
    	        if($choix) # Si le tirage existe
    	        {
    		       print "TIRAGE EXISTE\n";
    		       delete($hash{$choix}); # On le supprime du hasH
     
    		       print Dumper(\%hash);
    	        }
    	}
     }
    print "nb d'élement final:$k\n";

  4. #4
    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
    Une idée sous forme d'un uniligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -E 'my @l = (1..20); say splice @l, rand(@l), 1 while @l;'
    La fonction splice retire un élément du tableau (aléatoire grâce à rand) et le retourne, la boucle ré-itère tant qu'il y a des éléments dans le tableau.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 142
    Points : 57
    Points
    57
    Par défaut
    Merci CosmoKnacki et Philou67430.

    Finalement, j'ai effectué cela sous R à l'aide de sample

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

Discussions similaires

  1. extraction de manière aléatoire d'une sous base
    Par malika29 dans le forum MATLAB
    Réponses: 1
    Dernier message: 02/01/2013, 13h35
  2. [XL-2007] Extraction de données par sous ensemble
    Par apt dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 08/09/2012, 13h53
  3. Réponses: 4
    Dernier message: 16/11/2010, 15h00
  4. [DBGrid] Affichage d'un sous-ensemble de données
    Par Jean-Jacques Engels dans le forum Bases de données
    Réponses: 3
    Dernier message: 02/09/2004, 16h31
  5. Sous-ensembles de tuples
    Par HPJ dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/10/2003, 16h24

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