Générer un entier aléatoire en C++
Répondre à la discussion
Affichage des résultats 1 à 24 sur 24

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



  1. #1
    invite234d9cdb

    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. #2
    erik

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

    Utilise la fonction rand()

  3. #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,

  4. #4
    invite3d7be5ae

    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.

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

    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

  7. #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,

  8. #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,

  9. #8
    invite234d9cdb

    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 ?

  10. #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,

  11. #10
    invite234d9cdb

    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 ?

  12. #11
    invite3d7be5ae

    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.

  13. #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.

  14. #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,

  15. #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,

  16. #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)

  17. #16
    invite3d7be5ae

    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.

  18. #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

  19. #18
    invite3d7be5ae

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

    Oops là, je l'avais sauté.

    Pole

  20. #19
    invite234d9cdb

    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.

  21. #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.

  22. #21
    invite234d9cdb

    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

  23. #22
    invite3d7be5ae

    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.

  24. #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,

  25. #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.

Discussions similaires

  1. entier
    Par invitea121f130 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 02/02/2007, 14h05
  2. Entier infini ?
    Par invite4b1905cf dans le forum Mathématiques du supérieur
    Réponses: 82
    Dernier message: 14/12/2006, 21h01
  3. Entier naturel
    Par invite693d963c 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 invitee75a2d43 dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 21/06/2006, 09h26
  5. tv du monde entier
    Par inviteb3af1c79 dans le forum Dépannage
    Réponses: 6
    Dernier message: 27/04/2004, 20h11
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...