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 :

fonction rand() sur chaine de caracteres


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Points : 48
    Points
    48
    Par défaut fonction rand() sur chaine de caracteres
    Salut tout le monde!

    je veux écrire un programme dont l entrée une chaine de caractere telque:
    1000-------- c est a dire des bits définies (ici 1000) qui ne changent pas et des bits don´t care(-).
    je veux remplacer les dont care par 1 ou 0 avec une fonction random.

    avez vous une idée?

    Merci!

  2. #2
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $chaine = "1000--------"
    while($chaine =~ /-/)
    {
      $alea = random 0 ou 1 #Ne connaît pas la fonction random :lol:
      $chaine =~ s/-/$alea/;
    }
    C'est une esquisse donc. Qu'en penses tu ?

  3. #3
    Membre du Club
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Points : 48
    Points
    48
    Par défaut
    Salut Olivier!
    Merci pour ton coup de pousse!
    voila a quoi peut resembler mon code:

    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
     
    #!/usr/bin/perl -w
    use strict;
    use warnings;
     
     
    my $chaine = "1000--------";
     
    while($chaine =~ /-/)
    {
    for (0..1){
    my $bit=int(rand(2));
      $chaine =~ s/-/$bit/;
    }
    redo if  $chaine =~ /-/;
    print $chaine;
    }
    c est pas tout ce que je veux generer mais une un bon debut!

  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 expression régulière simple telle que celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $chaine = "1000--------";
    $chaine =~ s/-/int(rand(2))/ge;
    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
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Points : 48
    Points
    48
    Par défaut
    Merci encore camarades !

    maintenant je veux pas generer 1 seul nombre binaire mais n nombres binaires avec n=nombre des dont care (-)

    c est a dire si on a 1000-------- je veux generer 8 nombres binaires
    si on a 1000------11 je veux generer 6 nombres binaires
    si on a 1--1 seulement 2 nombres binaires

    j ai voulu enrigistrer le nombre n des dont care dans une variable et puis je construis une for mais j arrive pas a avoir ce nombre dans mes mains!

    merci pour votre aide!

  6. #6
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut
    Peux tu être plus précis ?
    Quelque soit ton nombre de (-)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $chaine =~ s/-/int(rand(2))/ge;
    te les remplace tous...

  7. #7
    Membre du Club
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Points : 48
    Points
    48
    Par défaut
    je donne un exemple concret:

    1000---- comme entrée

    je veux 4 nombre génerer aléatoirement (ils peuvent etre comme ca):

    10000001
    10001010
    10001111
    10000001

    jusqu a maintenant le code genere 1 seul nombre aléatoire!

    je veux n nombres aléatoires diffirents comme sortie
    telque n= nombre des dont care (-): si il ya 4 "-" je veux 4 nombres aléatoires
    si il ya 8 "-" je veux 8 nombres aléatoires.

    j esperes que j etais plus clair dans mes explications!

  8. #8
    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
    Pour compter les occurrences d'un motif, il suffit d'évaluer une expression régulière dans un contexte de liste (afin qu'il retourne la liste des occurrences) et de le convertir (automatiquement) en scalaire pour en obtenir le nombre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nb_dont_care = @{[$chaine =~ /-/g]};
    Une autre manière est utiliser l'opérateur "tr" de traduction (en remplaçant - par -) et qui retourne le nombre de caractère modifiés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nb_dont_care = $chaine =~ tr/-/-/;
    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

  9. #9
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut
    Oui beaucoup plus clair
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $tmp = $chaine;
    $cpt = 0;
    while($tmp =~ /-/)
    {
      $tmp =~ s/-//;
      $cpt++; #à vérifier que l'incrémentation marce sinon $cpt = $^cpt+1;
    }
    Le compteur cpt te donnera le nombre de (-).
    Note qu'il est nécessaire de créer une variable tmp pour enregistrer ta chaine vu que tu supprimes les (-) dans ta boucle
    Après il existe peut être une fonction count que je ne connait et qui simplifierai ton code ^^

  10. #10
    Membre du Club
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Points : 48
    Points
    48
    Par défaut
    Encore merci Olivier et Philou!

    je bricole un peu et je reviens si j ai une autre question!

  11. #11
    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
    Avec la méthode de Olivier.p, il n'est pas nécessaire de supprimer les - pour les compter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $cpt = 0;
    $cpt++ while $chaine =~ /-/g;
    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

  12. #12
    Membre du Club
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nb_dont_care = @{[$chaine =~ /-/g;]};
    p.s: je crois que le ";" apres le g est faux.
    jai compilé le code avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nb_dont_care = @{[$chaine =~ /-/g]};
    et ca marche super!

    Merci!

  13. #13
    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
    Exact, désolé pour la typo...
    J'ai corrigé le post.
    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

  14. #14
    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
    Citation Envoyé par Philou67430 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nb_dont_care = @{[$chaine =~ /-/g;]};
    l'idiome traditionnel pour compter le nombre d'occurence d'une regex est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $count =()= $chaine =~ m/-/g;
    Bien sûr s'il s'agit d'un simple caractère, la méthode avec tr// est plus efficace.

    --
    Jedaï

  15. #15
    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
    Exact Jedaï, merci pour ce rappel
    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

  16. #16
    Membre du Club
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Points : 48
    Points
    48
    Par défaut
    Voici mon code:

    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
    #!/usr/bin/perl -w
    use strict;
    use warnings;
     
    &can_mapping("1000--------");
     
     
    sub can_mapping 
    {
    my $can_mapping = shift @_;
    my $count =()= $can_mapping =~ m/-/g;
    for(1..$count){
    while($can_mapping =~ /-/)
    {
    $can_mapping =~ s/-/int(rand(2))/ge;
    }
     
    my $bin_prefix="0b";
    my $can_mapping_bin = $bin_prefix.$can_mapping;
    my $can_mapping_dec = oct($can_mapping_bin); 
    print $can_mapping, "=>", $can_mapping_dec, "\n";
    }
    return;
    }
    voila ce que j obtiens:

    100011100110=>2278
    100011100110=>2278
    100011100110=>2278
    100011100110=>2278
    100011100110=>2278
    100011100110=>2278
    100011100110=>2278
    100011100110=>2278
    il ne fonctionne pas comme je souhaite!
    je veux des nombres binaires diffirents et non pas un seul nombre qui se repette!

    quelqu un a une idée?
    Merci!

  17. #17
    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
    L'expression régulière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $can_mapping =~ s/-/int(rand(2))/ge;
    remplace déjà "toutes les occurences de -" dans la chaine d'origine, il est donc inutile de bouclier "tant qu'il y a des -") :

    Par ailleurs, tu ne mémorises pas ta chaine $can_mapping contenant les "-"... donc une fois modifiée, elle ne contient plus de "-", et l'expression régulière ne modifie plus cette chaine.
    Essaye avec cette fonction can_mapping :

    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
    sub can_mapping 
    {
      my $can_mapping = shift @_;
     
      my $count =()= $can_mapping =~ m/-/g;
      for (1..$count) {
        (my new_can_mapping = $can_mapping) =~ s/-/int(rand(2))/ge;
     
        my $bin_prefix="0b";
        my $can_mapping_bin = $bin_prefix.$new_can_mapping;
        my $can_mapping_dec = oct($can_mapping_bin); 
        print $can_mapping, "=>", $can_mapping_dec, "\n";
      }
      return;
    }
    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

  18. #18
    Membre du Club
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 87
    Points : 48
    Points
    48
    Par défaut
    Un grand merci Philou!

    Si tu passes par Munich ou le sud tunisien sache que tu as quelqu un
    qui est tres reconnaisant pour ton aide!

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

Discussions similaires

  1. [XL-2003] Fonction split ou autre sur chaine de caractere
    Par zoumzoum59 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/02/2015, 01h38
  2. fonction rand() sur liste ?
    Par debutant-1 dans le forum C
    Réponses: 10
    Dernier message: 24/05/2006, 10h58
  3. random en fonction d'une chaine de caractere
    Par tatayoyo dans le forum C
    Réponses: 6
    Dernier message: 28/02/2006, 21h23
  4. Fonction Comptage de chaine de caractere
    Par Boubou1283 dans le forum C
    Réponses: 14
    Dernier message: 16/10/2005, 08h23
  5. Réponses: 3
    Dernier message: 19/12/2004, 14h30

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