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 :

générer un nombre aléatoire compris entre 2 autres [Trucs & Astuces]


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 92
    Points : 49
    Points
    49
    Par défaut générer un nombre aléatoire compris entre 2 autres
    bonjour,

    comment générer un nombre compris entre 5 et 10 (par exemple) en C ?

    merci!

  2. #2
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Points : 20
    Points
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (( rand() / RANDMAX) * 5) + 5)
    (rand() / RANDMAX) => genere un nombre aléatoire entre 0 et 1

    PS : Il faut faire un srand(time()) (pas sur de l'exactitude ...) avant pour que le nombre aléatoire soit vraiment aléatoire

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par djfrancky
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (( random() / RANDMAX) * 5) + 5)
    Non. rand()

    PS : Il faut faire un rand(time())
    Non. srand()

    La reponse a la question d'origine est donnee dans la FAQ de ce forum.

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Points : 20
    Points
    20
    Par défaut
    ouep désolé j'ai corrigé un poil tard ;-)

  5. #5
    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
    C'est en effet dans la Faq de ce forum mais juste pour corriger dans ce post aussi, l'écriture de srand est généralement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    srand((int)time(NULL));
    http://c.developpez.com/faq/c/?page=...ES_random_init

    Jc

  6. #6
    Membre averti Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Points : 358
    Points
    358
    Par défaut
    plus simple que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (( rand() / RANDMAX) * 5) + 5)
    c'est de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rand()%nombre_max + nombre_min

  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 Ekinoks
    plus simple que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (( rand() / RANDMAX) * 5) + 5)
    c'est de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rand()%nombre_max + nombre_min
    Le problème n'est pas d'être simple ou pas. Cette formule favorise les bits de poids faible et nuit à la répartition des valeurs avec certains générateurs pseudo-aléatoires.

    http://emmanuel-delahaye.developpez....d/inc/random.h
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 43
    Points : 31
    Points
    31
    Par défaut
    tu peux toujours essaier :

    X = (rand()%5) +5

    le srand() c'est pour initialiser le systeme aleatoire , genre randomize() de borland. Enfin je pense.
    si tu opte pour la brutalité :
    while ( x <5 )
    { x = rand()%10+1;
    }

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Le code suivant:
    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
    int alea(int n) {
        assert((0 < n) && (n <= RAND_MAX));
        int partSize   = (n == RAND_MAX) ?        1 : 1 + (RAND_MAX - n)/(n+1);
        int maxUsefull = (n == RAND_MAX) ? RAND_MAX : partSize * n + (partSize-1);
        int draw;
        do {
            draw = rand();
        } while (draw > maxUsefull);
        return draw/partSize;
    }
     
    int aleaInRange(int low, int high) {
       assert ((low < high) && (high - low <= RAND_MAX));
       return low + alea(high-low);
    }
    permet de tirer des nombes aleatoires entre 0 et N (bornes comprises) ou low et high(bornes comprises a nouveau). Il tient compte de
    • du biais quand N+1 ne divise pas RAND_MAX+1 (pour le voir, tirer un nombre entre 0 et 9 avec un RAND_MAX qui vaut 15: les nombres de 0 a 5 seront tires 2 fois plus souvent que ceux de 6 a 9)
    • du fait que les bits de poids forts sont parfois plus aleatoires que ceux de poids faibles
    • que RAND_MAX peut valoir INT_MAX


    Problemes dans les autres solutions proposees:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    randomValue = rand() % N;
    - utilise les bits de poids faibles
    - biais quand N ne divise pas RAND_MAX+1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int randomValue = (int)((float)rand() / RAND_MAX * (N - 1));
    - float peut avoir moins de precision que int, donc on perds des bits
    - corrige le probleme des bit de poids faibles
    - ne corrige pas le probleme de biais
    - introduit un biais supplementaire: ne genere N-1 que pour rand()==RAND_MAX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (int)((double)rand()/RAND_MAX * (num))
    - corrige le probleme des bit de poids faibles
    - ne corrige pas le probleme de biais
    - introduit un probleme supplementaire: ne genere num que pour rand()==RAND_MAX (ou bien genere parfois num, je ne sais pas quelle est la spec)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (( rand() / RANDMAX) * 5) + 5)
    - rand()/RANDMAX est un int, donc 0 ou 1...
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    J'ai essayé d'adapater les différents code de ce topic pour cree un programme qui génère aléatoirement un nombre Entier compris dans une intervalle donnée ... sans succès.

    Quelqu'un aurait ce code ?

    Merci

  11. #11
    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 : 40
    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
    Bonjour,

    Citation Envoyé par Legogo
    J'ai essayé d'adapater les différents code de ce topic pour cree un programme qui génère aléatoirement un nombre Entier compris dans une intervalle donnée ... sans succès.

    Quelqu'un aurait ce code ?
    Montre nous se que tu as fait parce qu'à partir des info des posts précédent cela doit fonctionner.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    J'étais parti de ça
    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
     
    int alea(int n) {
        assert((0 < n) && (n <= RAND_MAX));
        int partSize   = (n == RAND_MAX) ?        1 : 1 + (RAND_MAX - n)/(n+1);
        int maxUsefull = (n == RAND_MAX) ? RAND_MAX : partSize * n + (partSize-1);
        int draw;
        do {
            draw = rand();
        } while (draw > maxUsefull);
        return draw/partSize;
    }
     
    int aleaInRange(int low, int high) {
       assert ((low < high) && (high - low <= RAND_MAX));
       return low + alea(high-low);
    }
    Mais j'ai pas trouvé comment l'utiliser ^^

  13. #13
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    légère petite correction pour ce qui fut écrit plus haut : pour générer un nombre compris en Min et Max (Max exclu):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x = rand()%(Max-Min) + Min ;
    Si on ne met que modulo Max ou Min, on va avoir un souci

    Si Max est inclu, il faut rajouter un +1 dans le modulo.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  14. #14
    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 : 40
    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 ToTo13
    Bonjour,

    légère petite correction pour ce qui fut écrit plus haut : pour générer un nombre compris en Min et Max (Max exclu):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x = rand()%(Max-Min) + Min ;
    Si on ne met que modulo Max ou Min, on va avoir un souci

    Si Max est inclu, il faut rajouter un +1 dans le modulo.
    Ce n'est pas une solution idéale :
    Citation Envoyé par Jean-Marc.Bourguet
    - utilise les bits de poids faibles
    - biais quand N ne divise pas RAND_MAX+1

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Legogo
    J'étais parti de ça
    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
     
    int alea(int n) {
        assert((0 < n) && (n <= RAND_MAX));
        int partSize   = (n == RAND_MAX) ?        1 : 1 + (RAND_MAX - n)/(n+1);
        int maxUsefull = (n == RAND_MAX) ? RAND_MAX : partSize * n + (partSize-1);
        int draw;
        do {
            draw = rand();
        } while (draw > maxUsefull);
        return draw/partSize;
    }
     
    int aleaInRange(int low, int high) {
       assert ((low < high) && (high - low <= RAND_MAX));
       return low + alea(high-low);
    }
    Mais j'ai pas trouvé comment l'utiliser ^^
    Si je veux associé une valeur entre 0 et 3 (entier) a une variable "a"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int aleaInRange(int low, int high) {
       assert ((low < high) && (high - low <= RAND_MAX));
       return low + alea(high-low);
     
    a=aleaInRange(0,3);
    ça fonctionne ?

  16. #16
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Ca devrait. Tu as un problème?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  17. #17
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    pour utiliser la solution de Jean-Marc.Bourguet, ne pas oublier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <stdlib.h>
    #include <time.h>
    #include <assert.h>

Discussions similaires

  1. Nombre aléatoire compris entre min et max
    Par Gobble dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/11/2014, 13h56
  2. [Math / Random] Génération nombre aléatoire compris entre deux bornes
    Par oligig dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 30/06/2013, 17h23
  3. Générer un nombre aléatoire comprise entre x et y
    Par KamBMN dans le forum LabVIEW
    Réponses: 1
    Dernier message: 11/01/2013, 08h16
  4. Réponses: 7
    Dernier message: 15/11/2006, 18h34
  5. Nombre aléatoire compris entre deux nombres
    Par Jibees dans le forum ASP
    Réponses: 2
    Dernier message: 21/06/2006, 14h52

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