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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Les nombres aléatoires en C
    http://nicolasj.developpez.com/articles/libc/hasard/

    Au travers de ce tutoriel, je vais vous exposer différentes méthodes pour générer une suite de nombres pseudo-aléatoires. La théorie peut s'appliquer à tous les langages de programmation. Par contre les exemples seront donnés en C.
    Vous pouvez laisser un commentaire sur cet article à la suite.

  2. #2
    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 gege2061 Voir le message
    http://nicolasj.developpez.com/articles/libc/hasard/.

    IV. Mettons-y notre grain de sable
    Je ne suis pas du tout d'accord avec cette méthode.

    Que se passe-t-il si il y a plusieurs processus ?

    Et si il y a une autre fonction de génération avec sa propre logique ? Elle va avoir le même mécanisme et réinitialiser elle aussi la graine, sans prévenir ?

    D'une manière générale, les statiques, c'est NON.

    La méthode est connue : Un appel systématique à srand() au début du code (main(), avant toute boucle) et c'est tout.

    Si il y a plusieurs processus, à renouveler à chaque démarrage de processus (fork() etc.). En principe, c'est automatique si srand() est bien placé.

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je ne suis pas du tout d'accord avec cette méthode.

    Que se passe-t-il si il y a plusieurs processus ?

    Et si il y a une autre fonction de génération avec sa propre logique ? Elle va avoir le même mécanisme et réinitialiser elle aussi la graine, sans prévenir ?

    D'une manière générale, les statiques, c'est NON.

    La méthode est connue : Un appel systématique à srand() au début du code (main(), avant toute boucle) et c'est tout.

    Si il y a plusieurs processus, à renouveler à chaque démarrage de processus (fork() etc.). En principe, c'est automatique si srand() est bien placé.
    Il s'agit d'un tutoriel pour débutant, comme pour les autres, il y a forcement un choix à faire entre être accessible à tous et satisfaire des exigences de développeurs industriels...

    Même la norme C n'impose pas ce genre de chose : avec l'exemple du paragraphe 7.20.2.2 (n1256) peux importe que j'utilise une variable statique...

    Quand j'aurais le temps je rajouterai une note sur la bonne utilisation de srand, en attendant ton commentaires servira d'erratum.


  4. #4
    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 gege2061 Voir le message
    Il s'agit d'un tutoriel pour débutant,
    Justement. Éviter les mauvaises pratiques me semble une priorité. Il y va aussi de la réputation de sérieux du site...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 62
    Points
    62
    Par défaut a propos de la mise a echelle
    Salut,

    Je ne comprends pas bien cette partie :
    Nous obtenons plus de nombres compris entre 0 et 5, pour pallier ce problème, il faut réaliser une "mise à l'échelle" (extrait de la faq FAQ C) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <stdlib.h>
     
    int randomValue = (int)(rand() / (double)RAND_MAX * (N - 1));
    si on prend comme dans l'exemple RAND_MAX = 25 et N = 10, on se retrouve avec les possiblités suivantes :
    25 / 25 * (10-1) = 9
    24 / 25 * (10-1) = 8.64
    23 / 25 * (10-1) = 8.28
    22 / 25 * (10-1) = 7.92
    21 / 25 * (10-1) = 7.56
    20 / 25 * (10-1) = 7.2
    ...
    donc une fois casté on a 9, 8, 8, 7, 7, 7 ...
    On a donc moins de chance d'obtenir un 9 qu'un 7 non?

    ps: je n'ai rien trouvé dans la FAQ pointée au sujet de "mise a l'echelle".

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Voici la page dans la FAQ : http://c.developpez.com/faq/?page=al...runif_a_b_reel

    Après, effectivement, il y a quelque chose de louche dans la formule donnée.
    La répartition est bien meilleure avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int randomValue = (int)(rand() / (double)(RAND_MAX-1) * (N));

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