Perl choisir un nbre ou mot en aleatoire

Fermé
snufx Messages postés 6 Date d'inscription jeudi 17 mai 2007 Statut Membre Dernière intervention 14 février 2009 - 17 mai 2007 à 11:40
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 18 mai 2007 à 13:05
salut a tous
J'ai commence le perl depuis peu et la je suis un peu bloquer.
pourriez vous m'aider a comprendre.
voila mon soucis je choisis aleatoirement des chiffres en ecrivant ce programme
#!/usr/bin/perl;
use strict;

my @cle = (1,3,5,6,8,10);
my @cle1 = (1..100);

foreach $i (@cle) {
$cle[$i] = int(rand());
}
my @cle_aleatoire = @cle;
#print "$cle_aleatoire[0]\n";

for (my $i = 0; $i < 1; $i++) {
$cle1[$i] = int(rand(99)+1);
}
my @cle1_aleatoire = @cle1;
print "$cle1_aleatoire[0]\n";


for (my $i = 0; $i < 1; $i++) {
$cle[$i] = int(rand(5)+1);
}
my @cle_aleatoire = @cle;
print "$cle_aleatoire[0]\n";

il marche tres bien pour @cle1 mais pas pour @cle.
mon probleme est que des que je decide de mettre des valeurs bien definit a mon tableau, j'obtient des nbres ou valeur autre que celle contenu dans mon tableau.
Cela fait quelques jours que je tente differente chose,utilisation de (hash ) mais sans succes quequ'un pourrait il m 'eclairer merci

4 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
17 mai 2007 à 16:08
Salut,

ça te va comme ça?
Le script
~/trash/vider$ cat ccm.pl
#!/usr/bin/perl;
use strict;

my @cle = (1,3,5,6,8,10);
my @cle1 = 1..100;

my @cle_aleatoire  = map { rand @cle  } @cle;
my @cle1_aleatoire = map { rand @cle1 } @cle1;

map { s/\..*// } @cle_aleatoire,@cle1_aleatoire;

print "$cle_aleatoire[0]\n";
print "$cle1_aleatoire[0]\n";
print "@cle_aleatoire\n";
print "@cle1_aleatoire\n";
Le résultat
~/trash/vider$ perl ccm.pl
4
95
4 2 2 5 1 5
95 72 95 17 99 18 36 25 8 35 78 12 71 40 90 73 52 14 38 72 43 63 31 84 46 76 30 46 55 44 48 60 87 41 37 60 67 66 75 44 33 38 53 72 73 2 90 49 77 2 52 3 36 65 15 19 54 36 67 31 89 4 71 16 8 99 20 99 80 51 12 27 64 33 57 59 28 68 67 97 35 65 25 92 22 10 94 5 74 77 42 65 34 66 17 79 76 85 65 78
~/trash/vider$ perl ccm.pl
4
66
4 0 3 1 0 1
66 77 1 22 64 53 88 76 64 22 39 21 50 27 33 38 56 51 23 91 0 3 70 91 66 7 39 73 36 59 64 75 58 34 9 91 4 79 94 30 50 38 43 62 16 19 24 81 21 97 99 88 19 65 97 59 45 17 34 0 26 35 62 36 95 41 24 28 91 29 95 99 39 68 74 98 1 88 19 32 88 75 80 7 2 59 38 49 69 83 76 41 42 43 62 66 64 44 90 75
~/trash/vider$ perl ccm.pl
2
28
2 5 2 5 5 4
28 69 22 58 62 40 85 25 81 41 23 35 21 22 12 94 57 1 61 39 87 3 51 69 62 61 33 55 77 6 91 26 92 44 91 60 78 88 16 21 88 21 21 65 37 42 8 74 7 8 39 55 6 18 93 98 46 57 20 20 77 7 56 84 54 5 8 20 78 7 66 35 70 70 46 16 17 8 28 40 34 64 82 1 86 23 74 27 50 88 89 91 4 25 70 77 33 68 9 34
~/trash/vider$ perl ccm.pl
2
65
2 4 2 3 3 1
65 40 64 85 98 55 18 6 25 59 63 25 34 78 4 42 51 73 71 45 86 61 86 82 73 18 96 0 11 93 29 2 74 44 29 34 79 12 16 92 99 92 55 65 6 95 65 19 54 23 46 43 14 31 59 10 37 96 65 63 60 42 25 62 33 93 21 5 3 56 92 79 3 56 30 96 86 81 60 23 30 31 15 60 63 86 72 23 82 48 2 98 32 76 90 7 47 32 12 63
~/trash/vider$ perl ccm.pl
0
50
0 5 1 1 4 3
50 46 10 28 2 65 35 4 73 44 82 94 87 7 5 84 23 56 99 74 65 31 94 86 85 3 34 76 44 86 13 50 81 69 23 60 63 26 36 48 92 58 8 38 27 11 37 97 48 69 28 35 41 67 14 77 13 4 13 68 87 79 36 49 22 97 86 36 15 99 41 81 86 27 60 98 29 35 27 53 11 14 43 25 80 21 15 97 37 25 8 49 54 63 90 45 1 94 54 79
0
snufx Messages postés 6 Date d'inscription jeudi 17 mai 2007 Statut Membre Dernière intervention 14 février 2009
18 mai 2007 à 12:05
grand merci lami20j pour ta reponse

Mais une chose m'intrigue pourquoi je n'obtiens pas que les valeurs contenues dans le tableau @cle?

Les valeurs 2,0 s'affiche alors quel ne devrait pas.
0
snufx Messages postés 6 Date d'inscription jeudi 17 mai 2007 Statut Membre Dernière intervention 14 février 2009
18 mai 2007 à 12:34
he he une solution qui a l'air de marcher et beaucoup me plaire.Bien que je remercie lami20j et tous les autres pour leur reponse rapide malgre la diversite des questions.

my @values1 = (1,3,5,6,8,10);

for (1) {
#for (1..5) {
print "tirage aléatoire: ", $values1[rand @values1], "\n";
}

et avec du texte se serait plus ca

my @values = qw(robert roger anatole);
print "bonjour ", $values[rand @values], "\n";
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
18 mai 2007 à 13:05
Ben,


en revanche avec la fonction que j'ai écrit le tableau et bien melanger
il ne te reste qu'à afficher le 1er élément après chaque tirage

j'ai pris ton script comme point de départ et pas ce que tu veux en fait ("Un tirage aléatoire")

j'espère que tu as compirs pourquoi $cle[ rand @cle] te donne le bon résultat :-))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
18 mai 2007 à 12:54
Salut,

en fait le résultat c'est bon
en revanche ce n'est pas ça que tu veux ou j'ai mal compris :-))
je suppose que tu veux tout simplement melanger les éléments de tes tableaux

tu dois écrire quelque chose comme ça
#!/usr/bin/perl;
use strict;

my @cle = (1,3,5,6,8,10);

melanger(\@cle_alea);

sub melanger{
  my $tmp = shift;
  for(my $i = @$tmp;--$i;){
    my $j = int rand ($i + 1);
    @$tmp[$i,$j] = @$tmp[$j,$i];
  }
}

print "@cle_alea\n";


0