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 :

Encore génération aléatoire


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 56
    Points : 27
    Points
    27
    Par défaut Encore génération aléatoire
    Bonsoir,
    me voila toujours avec mes problèmes de génération aléatoire.

    Le code ne compile pas.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
     
     
    int methode_2, i, N;
     
    N = 51;
     
    for(i=0;i<50;i++)
    {
     methode_2 = (int)(rand() / (double)RAND_MAX * (N+1);
     
     printf("%d\n",methode_2);
    }
     
     
     
      system("PAUSE");	
      return 0;
    }

    Je vous remercie d'avance.

  2. #2
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Points : 1 001
    Points
    1 001
    Par défaut
    Et le srand() ?
    A moins que ton code soit fait pour afficher toujours le même nombre ?
    quelles erreurs annonce le compilateur ?
    Omnes Vulnerant Ultima Necat
    Bye

  3. #3
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    test.c: In function ‘main’:
    test.c:14: erreur: expected ‘)’ before ‘;’ token
    test.c:17: erreur: expected ‘;’ before ‘}’ token
    Tu as oublié une parenthèse ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(i=0;i<50;i++)
    {
     methode_2 = (int)(rand() / (double)RAND_MAX * (N+1));
     
     printf("%d\n",methode_2);
    }

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 56
    Points : 27
    Points
    27
    Par défaut
    J'ai résolu le problème, mais le générateur génère toujours les mêmes nombres dans le même ordre .

    Merci beaucoup

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 56
    Points : 27
    Points
    27
    Par défaut
    J'ai tenté un nouveau code trouvé dans la faq mais j'ai toujours le même problème.

    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
     
    int my_rand (void);
     
    int main (void)
    {
       int i,N;
     
       N = 52;
     
       int randomValue = (int)(my_rand() / (double)RAND_MAX * (N - 1));
     
       printf("%d", randomValue);
     /*  for (i = 0; i<1000; i++)
       {
        
         printf ("%d\n", my_rand());
       }*/
     
       i = getch();
       return (EXIT_SUCCESS);
     
    }
     
    int my_rand (void)
    {
       static int first = 0;
     
       if (first == 0)
       {
          srand (time (NULL));
          first = 1;
       }
       return (rand ());
    }
    Merci

  6. #6
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Points : 1 001
    Points
    1 001
    Par défaut
    Citation Envoyé par moi
    Et le srand() ?
    A moins que ton code soit fait pour afficher toujours le même nombre ?
    Omnes Vulnerant Ultima Necat
    Bye

  7. #7
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    Rajoute cette ligne au début de ton programmecf.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 56
    Points : 27
    Points
    27
    Par défaut
    Désolé, je ne sais pas du tout comment utilisé le srand.

    Merci pour ta réponse

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 56
    Points : 27
    Points
    27
    Par défaut
    Merci muad'dib.

    J'ai mis l'instruction
    rand(time(NULL));
    au début du programme. Dans le main.

    Sauf qu'à la place d'avoir le chiffre 3, le programme me sort le dhiffre 4, mais il sort toujours.

  10. #10
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    pas rand(time(NULL)), srand(time(NULL)) !!!!!!!!!!!!!!!!!!!!

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 56
    Points : 27
    Points
    27
    Par défaut
    Le s est parti au moment de copier mais je l'avais bien mis.


    Le srand est-il ben utile vu qu'il est déja présent dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int my_rand (void)
    {
       static int first = 0;
     
       if (first == 0)
       {
          srand (time (NULL));
          first = 1;
       }
       return (rand ());
    }

    Merci beaucoup

  12. #12
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    Citation Envoyé par sebdu94
    Le s est parti au moment de copier mais je l'avais bien mis.


    Le srand est-il ben utile vu qu'il est déja présent dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int my_rand (void)
    {
       static int first = 0;
     
       if (first == 0)
       {
          srand (time (NULL));
          first = 1;
       }
       return (rand ());
    }

    Merci beaucoup
    Au temps pour moi je n'avais pas vu qu'il y avait déja un srand().

    Chez moi j'obtiens effectivement le même résultat si j'exécute deux fois de suite le programme très rapidement, dans la même seconde apparemment. Il faudrait étudier de plus près la fonction srand() et voir si on peut lui passer un autre argument que time(NULL), ou alors préciser l'argument time de l'ordre de la microseconde ou quelque chose du genre !

    Cependant, si je reste dans le programme (avec un for) j'obtiens des valeurs toujours différentes, cela ne te convient-il pas ?

  13. #13
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    J'ai modifié my_rand de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int my_rand (void)
    {
    	struct timeb tb; 
      	static int first = 0;
     
      	if (first == 0)
    	{
    		ftime(&tb);
    		srand (tb.time + tb.millitm);
    		first = 1;
    	}
    	return (rand ());
    }
    J'utilise la fonction ftime pour récupérer les millisecondes et j'initialise srand() avec la valeur de l'heure actuelle en incluant ses millisecondes ! Ainsi j'ai aucune redondance des valeurs lors de 2 exécutions successives.

    A noter que tu auras besoin d'inclure <sys/timeb.h>

  14. #14
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Points : 1 001
    Points
    1 001
    Par défaut
    Moi j'ai fait comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int my_rand (void)
    {
       static int first = 0;
       
       if (first == 0)
       {
          srand (time+var);
    /*et var est un nombre aléatoire lui aussi */
          first = 1;
       }
       return (rand ());
    }
    Omnes Vulnerant Ultima Necat
    Bye

  15. #15
    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 sebdu94
    Le code ne compile pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    methode_2 = (int)(rand() / (double)RAND_MAX * (N+1);
    Il faut apprendre à compter ses parenthèses...
    Pas de Wi-Fi à la maison : CPL

  16. #16
    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 sebdu94
    J'ai résolu le problème, mais le générateur génère toujours les mêmes nombres dans le même ordre .
    http://emmanuel-delahaye.developpez.com/notes.htm#rand
    Pas de Wi-Fi à la maison : CPL

  17. #17
    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 sebdu94
    Le srand est-il ben utile vu qu'il est déja présent dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int my_rand (void)
    {
       static int first = 0;
     
       if (first == 0)
       {
          srand (time (NULL));
          first = 1;
       }
       return (rand ());
    }
    Cette méthode est certes astucieuse, mais douteuse. Je préfère qu'il soit placé de façon unique comme première instruction du main() hors de toute boucle.
    Pas de Wi-Fi à la maison : CPL

  18. #18
    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 muad'dib
    J'utilise la fonction ftime pour récupérer les millisecondes et j'initialise srand() avec la valeur de l'heure actuelle en incluant ses millisecondes ! Ainsi j'ai aucune redondance des valeurs lors de 2 exécutions successives.

    A noter que tu auras besoin d'inclure <sys/timeb.h>
    Quel bricolage... Même pas portable. La bonne méthode a été exposée maintes fois....
    Pas de Wi-Fi à la maison : CPL

  19. #19
    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 sebdu94
    J'ai tenté un nouveau code trouvé dans la faq mais j'ai toujours le même problème.
    Oui, il a été rapporté que le premier tirage était répétitif... (bug de gcc sous Windows)

    Je conseille ceci
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
     
    int my_rand (void)
    {
       static int first = 0;
     
       if (first == 0)
       {
          srand (time (NULL));
          first = 1;
       }
       return rand ();
    }
     
    int main (void)
    {
       int const N = 52;
       int i;
     
    /* pour rien */
       my_rand ();
     
       for (i = 0; i < 20; i++)
       {
          int randomValue = (int) (my_rand () / (double) RAND_MAX * (N - 1));
     
          printf ("%4d", randomValue);
       }
       printf ("\n");
       return 0;
    }
    Plusieurs tirages :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      50  39  18  26  23   6  47  41  36  41  22  18  50  39   9  46  33  50  44  16
      12  25   5  28  19  33  25  44  36  37  23   9   3  31  33   0  32  44  18  46
      37  47  31  32  10  35  32  50  36  30  25  40  11  14  29   9  32  34  17   2
    etc.
    Pour vérifier la répartition, je conseille de faire les histogrammes sur des milliers de tirages...
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Quel bricolage... Même pas portable. La bonne méthode a été exposée maintes fois....
    Citation Envoyé par ED
    Une seconde, c'est long, mais ça suffit pour les besoins courants.
    Que doit-on faire lorsque l'exécution se retrouve plusieurs fois dans la même seconde alors?

Discussions similaires

  1. Fonction de génération aléatoire gaussienne
    Par Linio dans le forum Langage
    Réponses: 5
    Dernier message: 13/08/2007, 12h57
  2. Problème de génération aléatoire
    Par sebdu94 dans le forum C
    Réponses: 13
    Dernier message: 19/05/2007, 18h04
  3. [VBA-E] memmory génération aléatoire d'images
    Par jhonnybegood dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/03/2007, 21h09
  4. génération aléatoire
    Par acewb00 dans le forum MFC
    Réponses: 1
    Dernier message: 02/12/2005, 09h46
  5. génération aléatoire de couleur claire
    Par jiraiya dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 25/02/2004, 19h52

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