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 :

rand() et RAND_MAX


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2010
    Messages : 18
    Points : 15
    Points
    15
    Par défaut rand() et RAND_MAX
    Bonjour,

    Sous Ubuntu avec gcc, j'ai tenté de faire un programme qui renvoie une valeur aléatoire entière entre 0 et 20.

    Il y a bien sûr la solution (qu'un camarade m'a soufflée après) qui consiste à écrire
    int nb_aleatoire=rand()%21. Mais je n'ai pas eu d'inspiration, et en consultant le manuel de rand(), j'ai vu qu'elle renvoyait un entier dans l'intervalle [0,RAND_MAX].

    J'ai alors copié le header stdlib.h qui contient RAND_MAX, dans le dossier de mon fichier C, en le renommant stdlib2.h. J'écris le programme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    #include "stdlib2.h"
     
    int main() {
     
       printf("%d",rand());
     
       return 0;
     
    }

    et je compile :

    et j'exécute

    Argh !

    Qu'ai-je mal fait ?

    Merci d'avance.

    endreillie

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2007
    Messages : 634
    Points : 407
    Points
    407
    Par défaut
    Salut,

    Tout d'abord il faut initialiser ton générateur de nombre aléatoire avec le time actuelle afin de ne pas avoir tout les temps les même nombres qui ressortes.

    De cette manière avec le timestamp actuelle :

    Concernant rand() en effet cette fonction renvoie un nombre entre 0 et RAND_MAX qui est une define.

    pour que tu ai un nombre compris entre X et Y, il faut utiliser un modulo (13 modulo 6 = 1 c'est le reste de la division de 13 par 6 => 13 - 2*6 = 1) Cela te permet de te ramener dans la tranche souhaitée.

    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    int RandomNumber = X + rand() % (Y + 1);
    Voilà j'espère avoir été clair.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    septembre 2007
    Messages
    7 299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 7 299
    Points : 23 434
    Points
    23 434
    Par défaut
    Bonsoir,

    Citation Envoyé par endreillie Voir le message
    J'ai alors copié le header stdlib.h qui contient RAND_MAX, dans le dossier de mon fichier C, en le renommant stdlib2.h. J'écris le programme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    #include "stdlib2.h"
     
    int main() {
     
       printf("%d",rand());
     
       return 0;
     
    }
    Tu aurais dû au minimum recevoir un avertissement (warning) de la part du compilateur t'indiquant que ce symbole a été redéfini.

    En fait, RAND_MAX n'est pas une variable sur laquelle s'appuie rand() pour faire ses calculs. Elle les fait comme elle l'entend et cela dépend de la plate-forme que tu utilises. « RAND_MAX » est un symbole #define imposé par la norme, défini à la compilation uniquement, et qui te donne la borne supérieure de l'intervalle couvert par rand() sur ta plate-forme. Le redéfinir n'a donc aucune incidence sur la bibliothèque standard, car elle est déjà compilée, qu'il n'est pas garanti que le code lui-même de cette fonction se réfère à ce symbole et parce que le calcul aura lieu à l'exécution.

    La manière la plus naturelle consiste effectivement à faire un modulo sur le résultat de ta fonction. Tu peux également additionner une valeur ( (rand()%a) + b ) si tu veux que le minimum soit différent de zéro. Par contre, elle a l'inconvénient d'introduire un biais, qui peut être gênant si l'aspect aléatoire de tes nombres est critiques (ex : application de crypto). Tout cela est expliqué dans la FAQ.

  4. #4
    Expert confirmé

    Inscrit en
    août 2006
    Messages
    3 896
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 896
    Points : 5 551
    Points
    5 551
    Par défaut
    Noi,
    Citation Envoyé par NeoKript Voir le message
    pour que tu ai un nombre compris entre X et Y, il faut utiliser un modulo (13 modulo 6 = 1 c'est le reste de la division de 13 par 6 => 13 - 2*6 = 1) Cela te permet de te ramener dans la tranche souhaitée.
    Non, ce n'est pas la bonne méthode.

    Ce sujet revient assez souvent, il n'est pas difficile de trouver ce qu'il faut faire.
    Les bons crus font les bonnes cuites.
    [Pierre Dac]

Discussions similaires

  1. Comportement étrange de rand() et RAND_MAX
    Par souviron34 dans le forum C
    Réponses: 11
    Dernier message: 24/04/2007, 12h42
  2. Erreur de Rand avec Microsoft visual c++ 6.0
    Par yoadsl dans le forum Visual C++
    Réponses: 9
    Dernier message: 15/03/2005, 21h59
  3. Pb de rand() qui tourne en boucle
    Par MadChris dans le forum MFC
    Réponses: 3
    Dernier message: 26/06/2004, 17h24
  4. Probleme de tirage avec rand ?
    Par sunshine33 dans le forum MFC
    Réponses: 5
    Dernier message: 14/01/2004, 16h57
  5. rand
    Par drKzs dans le forum C
    Réponses: 6
    Dernier message: 21/09/2003, 17h39

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