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 :

poids des éléments d'un tableau lors d'une sortie aléatoire


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Juin 2004
    Messages : 88
    Points : 74
    Points
    74
    Par défaut poids des éléments d'un tableau lors d'une sortie aléatoire
    Bonjour,

    je pense avoir fait un titre assez explicite, je possède un tableau avec un nombre assez restreint d'éléments et je voudrais que leur poids lors du tirage soit différent.

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             @actions = ("manger","aboyer","marcher","courir","tourner");
             $nbactions = @actions;
             $rand_action = $actions[int(rand($nbactions))];
    cependant je veux que manger ai 3 fois plus de chances de sortir et marcher 2 fois.


    Je peux faire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @actions = ("manger","manger","manger","aboyer","marcher","marcher","courir","tourner");
    Je ne trouve pas ça très propre

    Qui plus est, ça risque être facilement le "dawa" si j'ai 20 éléments avec des poids de 4 ou 5...

    Bref si vous aviez une petite idée de la méthode, avec des hash? en tout cas je vois mal comment jai pas un niveau suffisant et jai rien trouvé pour m'aider, je fais donc appel a vous

    Merci beaucoup bonne soirée

  2. #2
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Intéressant problème d'algorithmie.
    Effectivement, un hash peut être utile dans une étape intermédiaire, pour avoir une association élément-poids. Mais entrons dans le vif du sujet, je vais tâcher de tout expliquer dans les commentaires.
    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
    #! /usr/bin/perl
    use strict;
    use warnings;
     
    #on part d'un hash, par commodité d'ordre général.
    my %poids=
    (
      manger => 3,
      aboyer  => 1,
      marcher => 2,
      courir   => 1,
      tourner =>1
    );
    #on récupère les clés, histoire d'avoir un ordre fixe des données.
    my @valeurs = keys %poids;
    #ce qui permet de récupérer les poids dans l'ordre adéquat
    my @poids= map {$poids{$_}} @valeurs;
    #(j'applique peut-être des précautions inutiles en la matière)
     
    #on établit une liste des sommes cumulées des poids
    #pour des raisons qu'on verra plus loin, je les appelle des seuils.
    my $somme = 0;
    my @seuils = map {$somme+=$_} @poids ;
     
    #on tire un nombre entre 0 et $somme
    my $resultat = rand $somme;
    #on utilise une boucle pour déterminer l'indice du premier élément de @seuils à
    #être supérieur à $resultat
    my $i;
    for($i=0;$seuils[$i]<=$resultat;$i++)
    {
      #C'est con, j'ai rien trouvé à mettre dans la boucle.
      #Du coup, pour meubler, voici une blague de mon cru:
      #Ne dites pas "Je suis plié de rire", dites "Je me courbe de gausse"
      #Voila voilà.
    }
    #Et donc, l'indice $i est celui qu'il nous faut : joies et célébrations.
    my $action = $valeurs[$i];
    print "action : $action\n";
    Je ne sais pas si ma démarche est très claire, et je ne sais pas si elle est très clean, et il y a sans doute mieux, mais bon, j'ai un peu improvisé.
    Il peut être intéressant de noter qu'avec cet algorithme, les pondérations ne sont pas nécessairement entières.
    There's nothing like $HOME!

  3. #3
    Membre régulier
    Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juin 2004
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Juin 2004
    Messages : 88
    Points : 74
    Points
    74
    Par défaut
    Effectivement...

    je suis quand meme aller voir le rôle de map {} je connaissais pas
    jai adapté a mes besoins et le résultat est plutot probant

    merci à toi je n'en attendais pas autant

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

Discussions similaires

  1. insérer des données dans un tableau lors d'une boucle
    Par sissi25 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 31/05/2007, 09h19
  2. Réponses: 7
    Dernier message: 21/08/2006, 13h58
  3. [Struts] ordre des éléments dans un tableau de propriétés
    Par zais_ethael dans le forum Struts 1
    Réponses: 2
    Dernier message: 09/05/2006, 15h54
  4. Réponses: 4
    Dernier message: 17/04/2006, 20h10
  5. [dom je pense]accéder à des éléments d un tableau sans id
    Par luta dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 07/02/2006, 15h31

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