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 :

Les nombres aléatoires en C [Tutoriel]


Sujet :

C

  1. #21
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Aleph69
    Melem,

    je suis très surpris des propos que vous tenez.
    Pour le moment, l'intérêt d'en discuter avec vous me semble limité car il est évident que vous ne comprenez pas ce que j'écris.
    Par contre, vous devriez vous documenter un minimum sur les générateurs de nombres aléatoires avant de prendre position sur ce sujet.
    J'ai peur que vous défendiez ce tutoriel pour de mauvaises raisons.
    J'espère sincèrement que la rédaction, dont vous faites partie, prendra rapidement en compte les remarques de eilijah et Jean-Marc.Bourguet pour le faire corriger.
    D'accord, je vais me documenter un minimum sur la génération de nombres aléatoires, et sur tout ce que vous voulez d'autre aussi. En échange, je vous de demande de ne ne plus passer du coq à l'âne comme vous venez de le faire lorsque vous êtes sur le forum : Il n'a jamais été question jusqu'ici, dans nos échanges, des remarques d'elijah, de mabu et de Jean Marc. Ces remarques sont en effet valables et pertinentes : est-ce que je les ai "attaquées" ? Je ne "défends" pas le tutoriel comme vous l'avancez gratuitement, je ne me limite qu'à donner mon avis lorsque je le juge nécessaire, c'est tout.

    Concernant ces "remarques" d'ailleurs, elles étaient déjà dans la FAQ bien longtemps avant la création de ce fil, comme l'a souligné Jean Marc. Je vous redonne le lien (déjà donné par mabu) : [FAQ] Les nombres aléatoires. Mais clairement, le tutoriel et la FAQ n'ont pas les mêmes objectifs, d'où certaines divergences.

  2. #22
    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 Pierre Dolez Voir le message
    Bonjour ssMatio,
    Je parlais effectivement de randomize() qui est utilisable sous Windows.
    srand() est naturellement plus portable, mais il semble nécessaire de l'appeler avec un nombre aléatoire, par exemple l'heure. D'où ma préférence pour randomize() dans l'environnement Windows.
    Pour mémoire, la codage de randomize() (qui est une invention de Borland) est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define randomize() srand((int)time(NULL))
    C'est juste une facilité de codage ...

    D'autre part, srand() n'est pas 'plus portable'. Il est portable. C'est tout.
    Pas de Wi-Fi à la maison : CPL

  3. #23
    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 Pierre Dolez Voir le message
    Bonjour,
    J'ai fait un petit test
    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
    void TestRand(void)
    {
      float N;
      int Tab[10];
      for (int i=0; i<10; i++) Tab[i]=0;
      for (int i=0; i<100; i++)
      {
        N=(float)10.0*rand()/RAND_MAX;
        for (int j=9; j>=0; j--)
        {
          if (N>(float)j) {Tab[j]++; break;}
        }
      }
      for (int i=0; i<10; i++)
      {
        printf("rang %d  %d valeurs\n",i+1,Tab[i]);
      }
    }
    On dirait que ce n'est pas complet ...
    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
     
     
    -------------- Build: Debug in hello ---------------
     
    Compiling: main.c
    Linking console executable: bin\Debug\hello.exe
    C:\dev\hello\main.c: In function 'TestRand':
    C:\dev\hello\main.c:5: error: 'for' loop initial declarations are only allowed in C99 mode
    C:\dev\hello\main.c:5: note: use option -std=c99 or -std=gnu99 to compile your code
    C:\dev\hello\main.c:6: error: redefinition of 'i'
    C:\dev\hello\main.c:5: note: previous definition of 'i' was here
    C:\dev\hello\main.c:6: error: 'for' loop initial declarations are only allowed in C99 mode
    C:\dev\hello\main.c:8: warning: implicit declaration of function 'rand'
    C:\dev\hello\main.c:8: error: 'RAND_MAX' undeclared (first use in this function)
    C:\dev\hello\main.c:8: error: (Each undeclared identifier is reported only once
    C:\dev\hello\main.c:8: error: for each function it appears in.)
    C:\dev\hello\main.c:9: error: 'for' loop initial declarations are only allowed in C99 mode
    C:\dev\hello\main.c:14: error: redefinition of 'i'
    C:\dev\hello\main.c:6: note: previous definition of 'i' was here
    C:\dev\hello\main.c:14: error: 'for' loop initial declarations are only allowed in C99 mode
    C:\dev\hello\main.c:16: warning: implicit declaration of function 'printf'
    C:\dev\hello\main.c:16: warning: incompatible implicit declaration of built-in function 'printf'
    Process terminated with status 1 (0 minutes, 0 seconds)
    9 errors, 3 warnings
    Ceci fonctionne (en C90)
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <assert.h>
     
    void TestRand (void)
    {
       float N;
       int Tab[10];
       int i;
       for (i = 0; i < 10; i++)
          Tab[i] = 0;
       {
     
          int i;
          for (i = 0; i < 100; i++)
          {
             int j;
             N = (float) 10.0 *rand () / RAND_MAX;
             for (j = 9; j >= 0; j--)
             {
                if (N > (float) j)
                {
                   assert (j >=0);
                   assert (j < 10);
                   Tab[j]++;
                   break;
                }
             }
          }
       }
     
       {
          int i;
          for (i = 0; i < 10; i++)
          {
             printf ("rang %2d  %2d valeurs\n", i + 1, Tab[i]);
          }
       }
    }
     
    int main (void)
    {
       srand((int)time(NULL));
     
       TestRand();
       return 0;
    }
    Les résultats ne sont pas transcendants (mais 10 tirages, c'est peu).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    rang  1   8 valeurs
    rang  2   7 valeurs
    rang  3  14 valeurs
    rang  4  12 valeurs
    rang  5  11 valeurs
    rang  6   7 valeurs
    rang  7  12 valeurs
    rang  8   5 valeurs
    rang  9  12 valeurs
    rang 10  12 valeurs
     
    Process returned 0 (0x0)   execution time : 0.034 s
    Press any key to continue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    rang  1  11 valeurs
    rang  2   6 valeurs
    rang  3  13 valeurs
    rang  4  11 valeurs
    rang  5   8 valeurs
    rang  6  13 valeurs
    rang  7  12 valeurs
    rang  8   8 valeurs
    rang  9   8 valeurs
    rang 10  10 valeurs
     
    Process returned 0 (0x0)   execution time : 0.024 s
    Press any key to continue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    rang  1   9 valeurs
    rang  2  10 valeurs
    rang  3   8 valeurs
    rang  4  13 valeurs
    rang  5   8 valeurs
    rang  6  13 valeurs
    rang  7   9 valeurs
    rang  8  11 valeurs
    rang  9  10 valeurs
    rang 10   9 valeurs
     
    Process returned 0 (0x0)   execution time : 0.061 s
    Press any key to continue.
    Pas de Wi-Fi à la maison : CPL

  4. #24
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Concernant la portabilité en général, ou la non-portabilité de la fonction randomize(), vous avez parfaitement raison.
    Mais pour ma défense le suis un fidèle de Borland depuis 20 ans, Quand j'ai décidé d'utiliser randomise() au lieu de srand(), si Borland proposait une fonction, c'est qu'ils devaient avoir une bonne raison, donc j'aurais eu tord d'en décider autrement. Par ailleurs, la fonction d'initialisation de nombre aléatoire est appelée une fois et une seule dans un programme. Si je devais rendre mon code 100% portable, ce n'était pas dramatique.

    Concernant le test, il s'agit d'une fonction, et non d'un programme.
    Comme le main contient la fonction randomize(), le ne l'ai pas mis, mais j'a précisé qu'il était bon d'initialiser le générateur de nombres aléatoires.
    ...
    J'ai vu qu'entre-temps, vous l'aviez exécuté et affiché des résultats.
    Mais ce qui me gène un peu dans vos résultats, c'est que vous avez 3 fois le même chose, mais c'est normal si vous n'avez pas initialisé le générateur de façon aléatoire.
    ...
    Entre-temps, vous avez rajouté l'initialisation.

  5. #25
    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 Pierre Dolez Voir le message
    J'ai vu qu'entre-temps, vous l'aviez exécuté et affiché des résultats.
    Mais ce qui me gène un peu dans vos résultats, c'est que vous avez 3 fois le même chose, mais c'est normal si vous n'avez pas initialisé le générateur de façon aléatoire.
    ...
    Entre-temps, vous avez rajouté l'initialisation.
    J'avais surtout fait des erreurs de copié/collé
    Pas de Wi-Fi à la maison : CPL

  6. #26
    Invité
    Invité(e)
    Par défaut
    OK,
    Mais si on utilise srand() sans calculer la "graine" de façon aléatoire, on obtient toujours la même suite de nombres "aléatoires" en résultat.

  7. #27
    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 Pierre Dolez Voir le message
    OK,
    Mais si on utilise srand() sans calculer la "graine" de façon aléatoire, on obtient toujours la même suite de nombres "aléatoires" en résultat.
    Tu veux dire rand() ?
    Pas de Wi-Fi à la maison : CPL

  8. #28
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    OK,
    Mais si on utilise srand() sans calculer la "graine" de façon aléatoire, on obtient toujours la même suite de nombres "aléatoires" en résultat.
    Oui, mais utiliser une graine passe partout peut aussi poser problème.
    J'ai vu le problème il y a quelque temps d'un générateur de mot de passe :

    La graine était initialisée par srand(time_t(NULL)); Si le soft était lancé plusieurs fois trop rapidement, le mot de passe était le même.

    J'ai aussi lu (MISC n°50) qu'un site de poker en ligne présentait des problèmes de fiabilité (la distribution des cartes devenait dans certains cas calculable) en partie à cause de initialisation du moteur de nombre pseudo-aléatoire.

  9. #29
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tiens,je viens de tomber sur ce sujet en passant par la forum algorithmie. Dommage effectivement qu'on ne parle pas des différents types de hasard au moins un minimum. rand() fournit un hasard faible qu'il ne faut généralement pas utiliser quand on veut quelque chose qui ressemble de loin à du hasard.
    En revanche on voit bien pourquoi ne pas utiliser le modulo, c'est rare de voir les gens penser à ce biais !

Discussions similaires

  1. les nombres aléatoires en builder
    Par farid0031 dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/11/2009, 20h56
  2. Réponses: 6
    Dernier message: 15/10/2009, 21h18
  3. Etude sur les nombres pseudo-aléatoires
    Par odsen.s dans le forum C
    Réponses: 14
    Dernier message: 21/05/2007, 00h09
  4. [débutant] problème avec les nombres aléatoires
    Par happylife925 dans le forum Débuter
    Réponses: 12
    Dernier message: 10/03/2006, 15h47

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