Répondre à la discussion
Affichage des résultats 1 à 24 sur 24

Générer un entier aléatoire en C++



  1. #1
    LicenceXP

    Générer un entier aléatoire en C++


    ------

    Bonjour, c'est encore moi !

    Je cherche aujourd'hui à pouvoir générer un entier aléatoire compris entre 1 et 100 : comment faire ?

    -----

  2. Publicité
  3. #2
    erik

    Re : Générer un entier aléatoire en C++

    Utilise la fonction rand()

  4. #3
    invité576543
    Invité

    Re : Générer un entier aléatoire en C++

    Bonjour,

    Pas très précise la question!

    En utilisant des fonctions de génération aléatoire disponibles en bibliothèque?

    A partir des fonctions de base?

    Pseudo-aléatoire, ou "vrai" aléatoire?

    Qualité recherchée?

    ...

    Cordialement,

  5. #4
    Pole

    Re : Générer un entier aléatoire en C++

    Simplement 1+rand()%99
    Mais si tu veux une vraie répartition, il vaut mieux 1+(int)((float)rand()/32767*99)

    Pole.
    Pour comprendre la récursivité croisée, il faut comprendre les arbres d'appels. Et vice versa.

  6. A voir en vidéo sur Futura
  7. #5
    LicenceXP

    Re : Générer un entier aléatoire en C++

    Ma question n'est pas précise parce que je ne m'y connais pas

    Pour résumer j'ai besoin de générer des entiers le plus aléatoirement possible compris entre 1 et 100... Je ne m'y connais pas assez pour pouvoir dire autre chose

    Je vais essayer la formule de 1+(int)((float)rand()/32767*99)

    Même si le 32767 est une énigme pour moi

  8. #6
    invité576543
    Invité

    Re : Générer un entier aléatoire en C++

    Citation Envoyé par Pole Voir le message
    Mais si tu veux une vraie répartition, il vaut mieux 1+(int)((float)rand()/32767*99)
    Hmm... pas évident que ça change grand chose.

    Si on dispose d'un tirage garanti uniforme sur 0..32767, et que l'on veut en tirer un tirage sur 0..99 parfaitement uniforme, une méthode simple consiste à

    - tirer un nombre n dans 0..32767 jusqu'à ce que n<32700
    - prendre le reste de n divisé par 100

    Cordialement,

  9. Publicité
  10. #7
    invité576543
    Invité

    Re : Générer un entier aléatoire en C++

    Citation Envoyé par LicenceXP Voir le message
    Même si le 32767 est une énigme pour moi
    215 - 1

    Pole prend en compte les propriétés fine du générateur sous-jacent, et suppose que le résultat interne est sur 16 bit signé.

    Le principe général est correct, si on veut être très précis (par exemple obtenir une répartition vraiment uniforme, et qu'on utilise rand(), il faut prendre en compte les propriétés fines de rand().

    Mais si quelque chose d'un peu approximatif est suffisant, pas besoin de se casser la tête, la première formule de Pole suffit...

    Cordialement,

  11. #8
    LicenceXP

    Re : Générer un entier aléatoire en C++

    J'aimerai que chaque nombre, si je décide d'en faire apparaitre 15 par exemple, ait une probabilité égale de sortir, quelle code me conseillez-vous ?

  12. #9
    invité576543
    Invité

    Re : Générer un entier aléatoire en C++

    Citation Envoyé par LicenceXP Voir le message
    J'aimerai que chaque nombre, si je décide d'en faire apparaitre 15 par exemple, ait une probabilité égale de sortir, quelle code me conseillez-vous ?
    Si une précision telle que la proba de chaque nombre est 0.01 +/- 0.00002 (au pire, si ça se trouve rand() est meilleure que ça) te suffit, la première formule de Pole est suffisante.

    Cordialement,

  13. #10
    LicenceXP

    Re : Générer un entier aléatoire en C++

    Ce sera suffisant oui

    Comme vous me parlez de pseudo-aléatoire, je m'inquiète quand même d'une chose : si l'ordinateur est chargé de sortir des nombres compris entre 1 et 100 durant toute la journée, est-il possible que dans la suite ininterrompue de ces nombres ait des structures internes ? Autrement dit qu'après deux heures, ce soient exactement les mêmes nombres aléatoires qui ressortent ?

  14. #11
    Pole

    Re : Générer un entier aléatoire en C++

    Le 2ème.

    Pourquoi 32767? Tout simplement parce que rand() donne un nombre pseudo-aléatoire entre 0 et 32767. Si on le divise, on a un nombre entre 0 et 1, on le multiplie par 99 : entre 0 et 99, on ajoute 1 : entre 1 et 100.

    Pourquoi pas le 1er code?
    Prenons un exemple avec un rand() qui tire un nombre entre 0 et 10.
    Maintenant, on le met %4.
    Si c'est 0->0.
    1->1
    2->2
    3->3
    4->0
    5->1
    6->2
    7->3
    8->0
    9->1
    0 et 1 sont plus fréquent! 3 fois au lieu de 2 pour le reste.
    Maintenant, on divise par 10 et on multiplie par 4.
    0->0->0
    1->0.4->0
    2->0.8->0
    3->1.2->1
    4->1.6->1
    5->2->2
    6->2.4->2
    7->2.8->2
    8->3.2->3
    9->3.6->3

    Voilà, le plus est que les fréquences "bizarres" sont plus réparties alors qu'avec les %, elles se suivent.

    En fait c'est a peu près la même chose, mais le % est plus simple.

    Edit : Oui. La période doit être dans les 4 millards. (a mon avis très proche de 2^32)
    Sinon, fais ton générateur aléatoire. Exemple de site :
    http://www.apprendre-en-ligne.net/random/index.html . (je te conseille un générateur avec des congruences)

    Pole.
    Dernière modification par Pole ; 11/10/2006 à 13h42. Motif: Nouveaux messages
    Pour comprendre la récursivité croisée, il faut comprendre les arbres d'appels. Et vice versa.

  15. #12
    zoup1

    Re : Générer un entier aléatoire en C++

    Citation Envoyé par Pole Voir le message
    Pourquoi 32767? Tout simplement parce que rand() donne un nombre pseudo-aléatoire entre 0 et 32767.

    En fait rand() renvoie en nombre en 0 et MAX_RAND il se trouve que généralement MAX_RAND vaut 32767 mais cd n'est pas forcement le cas dans toutes les implémentations du C/C++.

    Il vaut donc toujours mieux utiliser MAX_RAND au lieu de 32767.
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  16. Publicité
  17. #13
    invité576543
    Invité

    Re : Générer un entier aléatoire en C++

    Citation Envoyé par Pole Voir le message
    Edit : Oui. La période doit être dans les 4 millards. (a mon avis très proche de 2^32)
    Bonjour,

    Sur quoi te bases-tu pour affirmer cela. En général, un générateur qui sort entre 0 et n a une période de l'ordre de n, pas de n²! Sinon, il tronque de lui-même sa précision, et on se demande bien à quoi ça rimerait...

    Cordialement,

  18. #14
    invité576543
    Invité

    Re : Générer un entier aléatoire en C++

    Citation Envoyé par Pole Voir le message
    Voilà, le plus est que les fréquences "bizarres" sont plus réparties alors qu'avec les %, elles se suivent.
    C'est un maigre progrès... La méthode que j'ai indiquée permet d'obtenir des fréquences exactement égales...

    Cordialement,

  19. #15
    invite765732342432
    Invité

    Re : Générer un entier aléatoire en C++

    Citation Envoyé par LicenceXP Voir le message
    Comme vous me parlez de pseudo-aléatoire, je m'inquiète quand même d'une chose : si l'ordinateur est chargé de sortir des nombres compris entre 1 et 100 durant toute la journée, est-il possible que dans la suite ininterrompue de ces nombres ait des structures internes ? Autrement dit qu'après deux heures, ce soient exactement les mêmes nombres aléatoires qui ressortent ?
    Non: pseudo aléatoire veut juste dire qu'avec une même initialisation, la suite des nombres sera la même.

    Celà me permet d'ailleurs de te rappeler d'initialiser le générateur de nombres aléatoires pour éviter d'avoir toujours la même réponse à chaque lancement de programme.
    Au début du programme, utilise donc:
    Code:
    srand(time(NULL));
    (ou autre chose du même genre)

  20. #16
    Pole

    Re : Générer un entier aléatoire en C++

    Il me semble que le générateur a bien un cycle de près de 2^32 mais il doit renvoyer une valeur mod MAX_RAND.
    Sinon pourquoi initialiser avec une valeur time(NULL) qui est bien plus grande que 2^15?
    Et un générateur avec un cycle si petit n'est pas super bon,non?
    Il vaut mieux quand on utilise n valeurs aléatoires que le générateur ait une période supérieure à n².

    On peut vérifier facilement.
    Code:
    #include <stdio.h>
    int main(){
        srand(time(NULL));
        int premiere=rand(),i;
        for (i=0;i!=100000;i++){
            if (rand()==premiere)printf("%d\t",i);
        }
        system("pause");
    }
    (Excusez-moi pour ceux qui n'ont pas Windows pour le "system(pause)")
    Et voilà. Pas de cycle plus petit que 100000.

    mmy:Tu parles de quelle formule?

    Pole.
    Pour comprendre la récursivité croisée, il faut comprendre les arbres d'appels. Et vice versa.

  21. #17
    invité576543
    Invité

    Re : Générer un entier aléatoire en C++

    Citation Envoyé par Pole Voir le message
    mmy:Tu parles de quelle formule?
    Pas une formule, un tout petit algo... Poste #6

    Cdlt

  22. #18
    Pole

    Re : Générer un entier aléatoire en C++

    Oops là, je l'avais sauté.

    Pole
    Pour comprendre la récursivité croisée, il faut comprendre les arbres d'appels. Et vice versa.

  23. Publicité
  24. #19
    LicenceXP

    Re : Générer un entier aléatoire en C++

    Une nouvelle question pour cette partie : comment générer un aléatoire entier compris entre deux variables entières a et b ?

    Le code : c=a+rand()%(b);


    Ne marche pas.

  25. #20
    zoup1

    Re : Générer un entier aléatoire en C++

    Pourquoi dis tu que cela ne fonctionne pas ?
    Cela donnes bien un nombre compris entre a et b ?
    La série obtenue à l'air à peu près périodique ?

    Sinon moi je préfère plutot
    c=a+ ceil(b*(1.0*rand())/RAND_MAX);
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  26. #21
    LicenceXP

    Re : Générer un entier aléatoire en C++

    En fait j'ai trouvé par tatonnement : il faut faire c=a+rand()%(b-a);

    Sur ce je vais me coucher, bonne nuit et merci pour tous tes conseils

  27. #22
    Pole

    Re : Générer un entier aléatoire en C++

    C'est plutôt c=a+ ceil((b-a)*(1.0*rand())/RAND_MAX);
    a+rand()%b donne un nb pseudo-aléatoire entre a et a+b.

    Pole.
    Pour comprendre la récursivité croisée, il faut comprendre les arbres d'appels. Et vice versa.

  28. #23
    invité576543
    Invité

    Re : Générer un entier aléatoire en C++

    Bonjour,

    La formule dépend si a et/ou b sont compris... Il y a des + ou -1 à mettre selon les cas...

    Cordialement,

  29. #24
    zoup1

    Re : Générer un entier aléatoire en C++

    Citation Envoyé par Pole Voir le message
    C'est plutôt c=a+ ceil((b-a)*(1.0*rand())/RAND_MAX);
    a+rand()%b donne un nb pseudo-aléatoire entre a et a+b.

    Pole.
    oui, tout à fait... j'avais bêtement repris modèle sur celle qui était proposée avec le modulo.

    Donc pour être tout à fait précis l'expression indiquée donne un nombre compris entre a et b avec (a inclus et b exclus)
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  30. Publicité

Discussions similaires

  1. entier
    Par sahdow dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 02/02/2007, 14h05
  2. Entier infini ?
    Par Rhizomatique dans le forum Mathématiques du supérieur
    Réponses: 82
    Dernier message: 14/12/2006, 21h01
  3. Entier naturel
    Par MagStellon dans le forum Mathématiques du collège et du lycée
    Réponses: 25
    Dernier message: 07/11/2006, 00h56
  4. entier de gauss
    Par christophe_de_Berlin dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 21/06/2006, 09h26
  5. tv du monde entier
    Par riccheca19 dans le forum Dépannage
    Réponses: 6
    Dernier message: 27/04/2004, 20h11
Découvrez nos comparatifs produits sur l'informatique et les technologies.