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

C Discussion :

fonction rand() sur liste ?


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 65
    Points : 18
    Points
    18
    Par défaut fonction rand() sur liste ?
    bonjour !
    j'ai une question tres debutante lol
    comment on peut utilisé la fonction rand() sur une liste ?
    je sais que rande génére un nobre alléatoire qu'on peut majoré par n (%n)
    mais je ne sais pas comment faire si je veux choisire au hazard dans une liste par exempl {1, 4, 9, 12}
    et dans le cas ou j'ai un char dans la liste par exemple {1, 4, 9, 12, oo, e}
    merci !

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par debutant-1
    bonjour !
    j'ai une question tres debutante lol
    comment on peut utilisé la fonction rand() sur une liste ?
    je sais que rande génére un nobre alléatoire qu'on peut majoré par n (%n)
    mais je ne sais pas comment faire si je veux choisire au hazard dans une liste par exempl {1, 4, 9, 12}
    et dans le cas ou j'ai un char dans la liste par exemple {1, 4, 9, 12, oo, e}
    merci !
    Tu fais un random sur le nombre d'indices à la place de l'élément et ensuite tu regardes ce qu'il y a dans ton tableau...

    Donc pour ton cas {1,4,9,12} tu génére un nombre entre 0 et 3 (inclus) et ensuite ce sera l'indice du nombre choisi...

    Jc

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 65
    Points : 18
    Points
    18
    Par défaut
    donc si j'ai bien comprit !
    pour la deuxiemme lista par exemple je declare la liste
    char L[1 4 9 12 oo e]
    et puis dans l'apel j'utile L[rand()%5] dans cette exemple c ca ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 65
    Points : 18
    Points
    18
    Par défaut
    enfaite mon problème est le suivant !
    j'utilse cet partie de code pour mettre la distence entre les noeud d'un grafe (les nombre represente la distance entre les noeud et "oo" represente l'infini = pas de connection entre les noeud !
    je veux faire un tableau de dimmention n qu'il gener de facon aléatoire ( 0 ou nombre ou "oo" )
    par exemple ici j'ai declarée a la main un tab 12x12

    value weight[no_vertices][no_vertices] =
    {
    /* HNL SFO LAX ORD DFW LGA PVD MIA Z1 Z2 Z3 Z4 */

    { 0, oo, 2555, oo, oo, oo, oo, oo, oo, oo, oo, oo}, /* HNL */
    { oo, 0, 337, 1843, oo, oo, oo, oo, oo, oo, oo, oo}, /* SFO */
    { 2555, 337, 0, 1743, 1233, oo, oo, oo, oo, oo, oo, oo}, /* LAX */
    { oo, 1843, 1743, 0, 802, oo, 849, oo, oo, oo, oo, oo}, /* ORD */
    { oo, oo, 1233, 802, 0, 1387, oo, 1120, oo, oo, oo, oo}, /* DFW */
    { oo, oo, oo, oo, 1387, 0, 142, 1099, oo, oo, oo, oo}, /* LGA */
    { oo, oo, oo, 849, oo, 142, 0, 1205, oo, oo, oo, oo}, /* PVD */
    { oo, oo, oo, oo, oo, oo, oo, 0, 200, oo, oo, oo}, /* MIA */
    { oo, oo, oo, oo, oo, oo, oo, 200, 0, 100, 300, oo}, /* Z1 */
    { oo, oo, oo, oo, oo, oo, oo, oo, 100, 0, 200, oo}, /* Z2 */
    { oo, oo, oo, oo, oo, oo, oo, oo, 300, 200, 0,400}, /* Z3 */
    { oo, oo, oo, oo, oo, oo, oo, oo, oo, oo, 400, 0}, /* Z4
    };
    */

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par debutant-1
    enfaite mon problème est le suivant !
    j'utilse cet partie de code pour mettre la distence entre les noeud d'un grafe (les nombre represente la distance entre les noeud et "oo" represente l'infini = pas de connection entre les noeud !
    je veux faire un tableau de dimmention n qu'il gener de facon aléatoire ( 0 ou nombre ou "oo" )
    par exemple ici j'ai declarée a la main un tab 12x12
    Je conseille de remplacer oo qui n'a aucun sens, par une valeur 'reservée', comme -1 ou MAX_INT, MIN_INT etc.
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "ed/inc/random.h"
     
    #define N 12
    #define INF -1
    #define DIST_MAX 1000
     
    struct path
    {
       size_t begin;
       size_t end;
       int distance;
    };
     
    static void init (int mat[N][N])
    {
       size_t i;
       for (i = 0; i < N; i++)
       {
          size_t j;
          for (j = 0; j < N; j++)
          {
             if (i == j)
             {
                mat[i][j] = 0;
             }
             else
             {
                mat[i][j] = INF;
             }
          }
       }
    }
     
    static void display (int const mat[N][N], char const **labels)
    {
       size_t i;
          printf ("%3s", "");
       for (i = 0; i < N; i++)
       {
          printf ("%3s ", labels[i]);
       }
       printf ("\n");
       for (i = 0; i < N; i++)
       {
          size_t j;
          printf ("%2s", labels[i]);
          for (j = 0; j < N; j++)
          {
     
             if (mat[i][j] == INF)
             {
                printf ("%4s", "___");
             }
             else
             {
                printf ("%4d", mat[i][j]);
             }
          }
          printf ("%2s\n", labels[i]);
       }
       printf ("\n");
          printf ("%3s", "");
       for (i = 0; i < N; i++)
       {
          printf ("%2s  ", labels[i]);
       }
       printf ("\n");
       printf ("\n");
    }
     
    static get_random_path (struct path *p_path)
    {
       p_path->begin = random(N);
       do
       {
          p_path->end = random(N);
       }
       while (p_path->begin == p_path->end);
       p_path->distance = random(DIST_MAX);
    }
     
    static void record_path (int mat[N][N], struct path *p_path)
    {
       mat[p_path->begin][p_path->end] = p_path->distance;
    }
     
    int main (void)
    {
       int mat[N][N];
       static char const *labels[N] =
          {
             "A",
             "B",
             "C",
             "D",
             "E",
             "F",
             "G",
             "H",
             "I",
             "J",
             "K",
             "L",
          };
       randomize();
       init (mat);
       display (mat, labels);
       {
          int i;
          for (i = 0; i < 10; i++)
          {
             struct path path;
             get_random_path(&path);
             record_path(mat, &path);
          }
       }
     
       display (mat, labels);
     
       return 0;
    }
    avec
    http://emmanuel-delahaye.developpez....d/inc/random.h
    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
     
         A   B   C   D   E   F   G   H   I   J   K   L
     A   0 ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ A
     B ___   0 ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ B
     C ___ ___   0 ___ ___ ___ ___ ___ ___ ___ ___ ___ C
     D ___ ___ ___   0 ___ ___ ___ ___ ___ ___ ___ ___ D
     E ___ ___ ___ ___   0 ___ ___ ___ ___ ___ ___ ___ E
     F ___ ___ ___ ___ ___   0 ___ ___ ___ ___ ___ ___ F
     G ___ ___ ___ ___ ___ ___   0 ___ ___ ___ ___ ___ G
     H ___ ___ ___ ___ ___ ___ ___   0 ___ ___ ___ ___ H
     I ___ ___ ___ ___ ___ ___ ___ ___   0 ___ ___ ___ I
     J ___ ___ ___ ___ ___ ___ ___ ___ ___   0 ___ ___ J
     K ___ ___ ___ ___ ___ ___ ___ ___ ___ ___   0 ___ K
     L ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___   0 L
     
        A   B   C   D   E   F   G   H   I   J   K   L
     
         A   B   C   D   E   F   G   H   I   J   K   L
     A   0 ___ ___ ___  43 ___ ___ ___ ___ ___ ___ ___ A
     B ___   0 ___ ___ ___ ___ ___ ___ 238 ___ 726 ___ B
     C 121 ___   0 ___ ___ ___ ___ ___ ___ ___ ___ ___ C
     D ___ ___ ___   0 ___ ___ ___ ___ ___ ___ 628 ___ D
     E ___ ___ ___ ___   0 ___ ___ ___ ___ ___ ___ ___ E
     F ___ ___ ___ ___ ___   0 ___ ___ ___ 715 ___ ___ F
     G ___ ___ ___ ___ ___ ___   0 ___ ___ ___ ___ ___ G
     H ___ ___ ___ 163 653 ___ ___   0 ___ ___ ___ ___ H
     I ___ ___ ___ ___ ___ ___ ___ 497   0 ___ ___ ___ I
     J ___ ___ ___ ___ ___ ___ ___ ___ ___   0 ___ ___ J
     K ___ ___ ___ ___ ___ ___ ___ ___ ___ ___   0 ___ K
     L ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___   0 L
     
        A   B   C   D   E   F   G   H   I   J   K   L
     
     
    Press ENTER to continue.
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 65
    Points : 18
    Points
    18
    Par défaut
    GRAND merci !
    ca ma été tres utile ton code !
    parcontre il me reste un petit truc que j'arrive pas à faire
    je veux initialisé les valeur d'un tableau de chaine de caractere ! avec les valeur suivante :
    char *string;
    string name[N] = {"N1","N2","N3","N4","N5","N6", "N7", "N8"..............,"NN"};
    j'ai essayer un truc mais ca marche pas vu que la valeur du pointeur ce met a jour !
    char *p = malloc (2*sizeof(char));

    string tab[n];

    for(i=0;i<n;i++)
    {

    sprintf(p,"N%d",i);
    tab[i]=p;

    }

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par debutant-1
    je veux initialisé les valeur d'un tableau de chaine de caractere !
    Il y a pourtant un exemple dans 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
       static char const *labels[N] =
          {
             "A",
             "B",
             "C",
             "D",
             "E",
             "F",
             "G",
             "H",
             "I",
             "J",
             "K",
             "L",
          };
    Si tu ne le comprends pas, pose des questions plus précises que "ca marche pas"...
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 65
    Points : 18
    Points
    18
    Par défaut
    j'ai vu ta reponse ! mais moi je veux l'intialisatin de N valeur sans les entree manuellement comme je l'ai ecrie en haut N1, N2.......NN en utilisant une boucle fort par exemple !
    peut etre que jen'ai pas compris ta reponse

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par debutant-1
    j'ai vu ta reponse ! mais moi je veux l'intialisatin de N valeur sans les entree manuellement comme je l'ai ecrie en haut N1, N2.......NN en utilisant une boucle fort par exemple !
    peut etre que jen'ai pas compris ta reponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       static char * const labels[N];
     
       labels[i] = "A";
       labels[i] = "B";
       labels[i] = "C";
       labels[i] = "D";
    etc.
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 65
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       static char * const labels[N];
     
       labels[i] = "A";
       labels[i] = "B";
       labels[i] = "C";
       labels[i] = "D";
    etc.
    cad il n'y a pas de solution que le faite de les entré manuellement ?

    static char * const labels[N];

    labels[1] = "N1";
    labels[2] = "N2";
    labels[3] = "N3";
    labels[4] = "N4";
    .
    .
    labels[N] = "NN";
    j'ai deja essayer de faire une boucle fort comme je vous ai dit :
    char *p = malloc (2*sizeof(char));

    string tab[n];

    for(i=0;i<n;i++)
    {
    sprintf(p,"N%d",i);
    tab[i]=p;

    }
    mais ca me donne un tab qui ne contient que de "NN" c normale je pense car le pointeur est mit a jour lors de lexecution nan ?
    merci

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par debutant-1
    cad il n'y a pas de solution que le faite de les entré manuellement ?
    Tu veux dire de manière interactive ? Par le clavier, par exemple ?

    Si, bien sûr. Il faut utiliser, par exemple, fgets(), supprimmer le '\n' proprement, créer une copie dynamique (strdup() [1]), stocker l'adresse de la copie dans le tableau de pointeurs... utiliser, libérer quand c'esr terminé...

    j'ai deja essayer de faire une boucle fort comme je vous ai dit :

    mais ca me donne un tab qui ne contient que de "NN" c normale je pense car le pointeur est mit a jour lors de lexecution nan ?
    Ca y est, j'ai percuté... (j'ai d'autres méthodes automatiques et statiques, alors, j'ai complètement oublié celle-ci...)

    C'est presque ça, mais
    • Il faut allouer à chaque tour
    • Ne pas oublier qu'une chaine se terminé par un 0...
    • sizeof (char) vaut 1 par définition. (C'est l'unité de taille en C)
    • Penser à libérer quand l'usage est terminé.
    --------------
    [1] strdup() n'est pas du C standard, mais POSIX.1, donc très portable.
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. fonction rand() sur chaine de caracteres
    Par ellgafsi dans le forum Langage
    Réponses: 17
    Dernier message: 03/06/2009, 16h44
  2. Contribution : Fonctions utilitaires sur les listes
    Par SpiceGuid dans le forum Caml
    Réponses: 25
    Dernier message: 20/02/2008, 20h52
  3. fonction rand sur un tableau ?
    Par Kyp_Durron dans le forum Langage
    Réponses: 16
    Dernier message: 17/11/2007, 23h39
  4. [Fonction]tri sur liste déroulante
    Par maxeur dans le forum IHM
    Réponses: 8
    Dernier message: 16/04/2007, 10h00
  5. Réponses: 2
    Dernier message: 11/10/2006, 21h11

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