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 :

[langage] fonction aléatoire


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 67
    Points : 34
    Points
    34
    Par défaut [langage] fonction aléatoire
    Bonnjour,
    j'ai besoin d'utiliser la fonction de C++ qui s'appelle random() et qui permet de générer des "résultats" au hazard. je ne sais pas comment s'utilise cette fonction en Perl.

    En fait, ce que je souhaite faire, c'est à partir d'une chaine de 1000 caractères, couper cette chaine en sequences de longueur de 16, 17,18, 19, 20,21 et 22 caractères. puis aléatoirement sélectionner 5 chaines de 16 caractères, 4 chaines de 17 caractères, 8 chaines de 19 caractères, 10 chaines de 20 caractères, 5 chaines de 21 caractères et enfin 3 chaines de 22 caractères.

    je n'ai pas vraiment d'idée....

    merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    salut

    http://www.perl-gratuit.com/cgi-bin/demos/pg-perldoc.pl

    ici tu peux rechercher par nom de fonction ou de modules la documentation qui correspond
    en perl tu as une fonction rand

    voici sa documentation

    rand EXPR
    rand
    Retourne un nombre fractionnaire aléatoire plus grand ou égal à 0 et plus petit que la valeur de EXPR (la valeur de EXPR devrait être positive). À défaut de EXPR, c'est 1 qui est utilisé comme borne. Appelle automatiquement srand() sauf cela a déjà été fait. Voir aussi srand().

    cela devrait t'aider

  3. #3
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut Re: fonction aléatoire
    Citation Envoyé par Kinethe
    Bonnjour,
    j'ai besoin d'utiliser la fonction de C++ qui s'appelle random() et qui permet de générer des "résultats" au hazard. je ne sais pas comment s'utilise cette fonction en Perl.
    Tout simplement la fonction rand( X ) qui retourne un nombre entre 0 et X...

    utilise le comme ça...

    Sinon je vais réfléchir un peu à ton problème. Mais j'ai peur de devoir faire des boucles en série...

    [Edit] arf grillé sur la ligne [/EDIT]
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  4. #4
    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
    Sans vouloir insister, je signale que Perl est fourni avec une excellente documentation (en anglais, mais il y a une traduction en français, cf l'annonce en haut du forum), voici la documentation pour la fonction rand (perldoc -f rand) :
    rand EXPR
    rand

    Returns a random fractional number greater than or equal to 0 and less than the value of EXPR. (EXPR should be positive.) If EXPR is omitted, the value 1 is used. Currently EXPR with the value 0 is also special-cased as 1 - this has not been documented before perl 5.8.0 and is subject to change in future versions of perl. Automatically calls srand unless srand has already been called. See also srand.

    Apply int() to the value returned by rand() if you want random integers instead of random fractional numbers. For example,

    int(rand(10))

    returns a random integer between 0 and 9, inclusive.

    (Note: If your rand function consistently returns numbers that are too large or too small, then your version of Perl was probably compiled with the wrong number of RANDBITS.)
    Il me semble que ceci est très explicite, non ? Combiné avec substr (perldoc -f substr) ceci suffira pour atteindre votre objectif.

    [EDIT] Décidemment trop lent .... Ce forum devient trop réactif pour moi !!
    --
    Jedaï

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    Citation Envoyé par Jedai
    [EDIT] Décidemment trop lent .... Ce forum devient trop réactif pour moi !!
    --
    Jedaï
    Yessssss
    enfin tu as un peu d'avance quant au nombre de reponses/questions postees !

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Voici un bout de code un peu + optimisé concernant l'aléatoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #!/usr/bin/perl -w
    use strict;
    srand( time() ^ ($$ + ($$<<15)) );
     
    print "nbre aléatoire compris entre 1 et 100 = ", Random(100);
    print "nbre aléatoire compris entre 1 et 50 = ", Random(50);
     
    sub Random
    {
    	my $max = shift();
    	my $nbr = int(rand $max) + 1;
    	return $nbr;
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    Encore qlq questons!

    Jedai tu dis que ca retourne un nb entre 0 et 9, or moi il faut que ca me retourne un nb entre 4 et 10 ( et même 21 car il faut aussi que je selectionne 21 chaines de 28 caractères).

    mais je vais essayer avec tous ce que vous m'avez dit.

    mais je veux bien de l'aide eencore pour le "découpage" de la séquence

    car en fait, mon but est de reproduire une population déjà obtenue par un petit prog que j'ai écrit et dc je veux une population en réalité de ( à partir d'une sequence de 1000 caractères):
    3 chaines de 16 caractères,
    3 chaines de 17 caractères,
    2 chaines de 18 caractères,
    6 chaines de 19 caractères,
    5 chaines de 20 caractères,
    11 chaines de 21 caractères,
    14 chaines de 22 caractères,
    23 chaines de 23 caractères
    40 chaines de 24 caractères,
    28 chaines de 25 caractères,
    22 chaines de 26 caractères,
    13 chaines de 27 caractères,
    4 chaines de 28 caractères,
    1 chaines de 29 caractères,

    merci

  8. #8
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Du coup un truc comme ça devrait fonctionner:
    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
    #!/usr/bin/perl -w 
    use strict;
     
    sub Random # mici bcp :D Arioch.
    {
       my $max = shift();
       my $nbr = int(rand $max) + 1;
       return $nbr;
    } 
     
    my $seq = "abcdefghijklmnopqrstuvwxyz";
    my $lengthsubseq = 5;
    my $begin;
    my $i;
    my $part;
     
    for($i=1;$i<=10;$i++){
     
    	$begin = (int(Random(length($seq)))+1+$lengthsubseq)%(length($seq)-$lengthsubseq);
    	$part = substr($seq,$begin,$lengthsubseq);
    	print $part."\n";
    }
    J'ai juste un petit problème avec les intervalles (un peu comme le nombre de barrière entre X poteaux... ). Moyen d'avoir un truc plus propre que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$begin = (int(Random(length($seq)))+1+$lengthsubseq)%(length($seq)-$lengthsubseq);
    parce que franchement je dois mal gérer mon modulo...

    [Edit] c'est bon de voir le forum perl dynamique[/Edit]
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  9. #9
    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
    Il suffit de faire un peu d'arithmétique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #entre 4 et 10 :
    my $i = 4 + int(rand 7);
    Plus généralement tu peux écrire une fonction qui te renvoit un entier entre deux bornes (incluses) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sub random ($$) {
      my ($min, $max) = @_;
      return ($min + int(rand( $max - $min + 1 )));
    }
    --
    Jedaï

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    en fait j'ai déja une fonction qui coupe tous les 19 caractères ( ca fonctionne) maintenant je vais essayé d'ajouter la fonction aléatoire grace à ts vos conseils
    merci!
    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
    #!/usr/bin/perl -w
    use strict;
     
    my $sequence ="gttccaaaaacagtggataattttgtggccttagctacaggagagaaaggatttggctacaaaaacagcaaattccatcgtgtaatcaaggacttcatgatccagggcggagacttcaccaggggagatggcacaggaggaaagagcatctacggtgagcgcttccccgatgagaacttcaaactgaagcactacggg"; 
    $sequence = uc $sequence;
     
    my $longueur;
    my $boucle=0;
    my $lim;
    my $ligne=0;
    my $compte;
     
    my $length_si = 19; 
    my @table;
     
    $sequence=~tr/U/T/;
     
    print $sequence;
     
    $longueur=length($sequence);
     
    print "$longueur\n";
    $lim=$longueur-$length_si+1;
     
    while ($boucle< $lim)
     
    	{
     
    $table[$boucle]=substr ($sequence, $boucle, $length_si);
    $ligne ++;
    $compte = $ligne + 2;
    #print "$compte";
    #print "Ligne $ligne \t $table[$boucle]\n";
    print "$table[$boucle]\n";
    $boucle = $boucle+2;	
     
    	}

  11. #11
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par Jedai
    Plus généralement tu peux écrire une fonction qui te renvoit un entier entre deux bornes (incluses)
    mais pour le substring tu peux sortir du tableau...

    [EDIT] PITIE coupe ta sequence ! je me retrouve avec une mega page pas marrante à lire [/EDIT]
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  12. #12
    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
    Je pense qu'un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my $seq = "abcdefghijklmnopqrstuvwxyz";
    my $lengthsubseq = 5; 
     
    foreach (1..10) {
      print substr( $seq, int( rand( length($seq) - $lengthsubseq ) ), $lengthsubseq);
    }
    devrait convenir. (Bien sûr on met plutôt les sous-séquences dans un tableau pour les garder)

    [Edit] Choupi, je répondais à son autre question.
    --
    Jedaï

  13. #13
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Yes je prefere aussi ce code... Juste je prefere casser le random du substring... Mais apres on titille. Mici. (enfin c'est pas à moi de dire merci la )
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  14. #14
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Choupi > ajoute la fonction srand() au début de ton code (après le use strict. srand() sert à initialiser l'aléatoire tandis qu'ensuite, chaque appel à rand() pioche un nbre aléatoire.

    Si tu n'utilises pas srand(), tes appels à rand() risquent très souvent de produire les mêmes résultats.



    PS : et le must si tu veux de l'aléatoire plus poussé (disons, plus proche du vrai hasard), remplace srand() au debut de ton code par mon srand de toute à l'heure (celui avec plein de signes bizarres )

  15. #15
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Normalement si srand() n'est pas présent, ca l'appelle automatiquement. Si il est présent, alors on conservera tjs cette graine...

    Confirmation ?

    [edit troll] je comprend pas ta derniere phrase. La graine change en rien la qualite du tirage aleatoire.... c'est lie directement à la fonction pas à la graine ... [/edit fin du troll]

    Tag résolu au fait
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  16. #16
    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
    Dans les versions récentes de Perl, il est plutôt recommandé de ne pas appeler srand() et de laisser rand() faire le boulot, on obtient un meilleur résultat. (attention, ceci n'est valable que pour les versions récentes)


    --
    Jedaï

  17. #17
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    J'comprend pas ! Le srand c'est pour avoir la graine du generateur pseudo aleatoire... Ca n'a rien à voir avec la qualité de ce générateur... D'ailleurs je trouve meme pas l'algo derriere cette fonction
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  18. #18
    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
    Si bien sûr ! srand() permet de modifier la graine, donc de modifier les résultat de rand() !

    --
    Jedaï

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 67
    Points : 34
    Points
    34
    Par défaut
    bon là, je suis un peu perdu
    ca devient trop "pro" pr moi
    dc j'ai essayé ce code ms je n'obtient pas vraiment ce que je voulais
    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
     
    #!/usr/bin/perl -w 
    use strict;
     
    sub Random
    {
    my $max =shift();
    my $nbr = int ( rand ($max)+1);
    return $nbr; 
    }
     
    my $seq = "GTTCCAAAAACAGTGGATAATTTTGTGGCCTTAGCTACAGGAGAGAAAGGATTTGGCTACAAAAACAGCAAATTCCATCGTGTAATCAAGGACTTCATGATCCAGGGCGGAGACTTCACCAGGGGAGATGGCACAGGAGGAAAGAGCATCTACGGTGAGCGCTTCCCCGATGAGAACTTCAAACTGAAGCACTACGGG"; 
    my $lengthsubseq = 5; 
    my $begin; 
    my $i; 
    my $part; 
     
    for($i=1;$i<=10;$i++)
    {
     
    $begin = ( int( Random(length ($seq)))+1+$lengthsubseq)%( length ($seq)-$lengthsubseq);
     
    $part = substr($seq,$begin,$lengthsubseq); 
    print $part."\n";
    }
    et j'obtient seulement:



    AGATG
    CGGAG
    GGAGG
    ACAGG
    TTCAT
    CTACG
    CTGAA
    AGGAT
    GGACT
    CAAAC
    alors que en fait je voudrais :
    3 chaines de 16 caractères,
    3 chaines de 17 caractères,
    2 chaines de 18 caractères,
    6 chaines de 19 caractères,
    5 chaines de 20 caractères,
    11 chaines de 21 caractères,
    14 chaines de 22 caractères,
    23 chaines de 23 caractères
    40 chaines de 24 caractères,
    28 chaines de 25 caractères,
    22 chaines de 26 caractères,
    13 chaines de 27 caractères,
    4 chaines de 28 caractères,
    1 chaines de 29 caractères,
    si vous avez la solution......

    merci

  20. #20
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par Jedai
    Si bien sûr ! srand() permet de modifier la graine, donc de modifier les résultat de rand() !
    Arf mais tu confonds deux choses : la sequence aleatoire générée par le rand qui dépend de la graine ... Donc quand tu choisis la date (temps unix) dans ce cas tu genereras tjs des sequences differentes.

    Ceci dit, la qualité de la séquence produite n'a rien a voir avec cette graine ! Ca depend de la fonction elle meme, c'est pas pour rien qu'en C par exemple on remplace le rand "officiel" par le rand des numerical recipes...

    Concernant Kinethe :
    si vous avez la solution......
    on est sur un forum d'entraide. Tu as plusieurs versions (en plus plus ca va mieux c'est ) qui te permettent de faire le travail une fois. Complexifie un peu ton script et tu auras le résultat souhaité... Faut pas attendre une solution toute faite ici... C'est pas le but.

    [kenethe stp, supprime ta longue sequence... ca genere des pages larges et ca complique la lecture thx )
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Langage] Fonction amie d'une autre fonction
    Par Klaim dans le forum Langage
    Réponses: 7
    Dernier message: 09/11/2008, 04h35
  2. [langage] fonction pour fichier ou bien dossier
    Par moniatn dans le forum Langage
    Réponses: 6
    Dernier message: 26/10/2006, 01h39
  3. Réponses: 2
    Dernier message: 30/03/2004, 11h31
  4. [langage] fonction sleep + probleme fenetre dos
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2003, 19h46
  5. Réponses: 3
    Dernier message: 02/09/2002, 18h49

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