-
11/10/2006 - 11h50 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 ?
-
Poursuivez votre recherche
-
11/10/2006 - 12h32 erik
Re : Générer un entier aléatoire en C++
Utilise la fonction rand()
-
11/10/2006 - 12h32
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,
-
11/10/2006 - 12h33 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. -
11/10/2006 - 12h39 LicenceXP -
11/10/2006 - 12h42
Re : Générer un entier aléatoire en C++
 Envoyé par Pole 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,
-
11/10/2006 - 12h46
Re : Générer un entier aléatoire en C++
 Envoyé par LicenceXP 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/10/2006 - 12h47 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 ?
-
11/10/2006 - 13h12
Re : Générer un entier aléatoire en C++
 Envoyé par LicenceXP 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/2006 - 13h27 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 ?
-
11/10/2006 - 13h38 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. -
11/10/2006 - 14h02 zoup1
Re : Générer un entier aléatoire en C++
 Envoyé par Pole 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. -
11/10/2006 - 14h06
Re : Générer un entier aléatoire en C++
 Envoyé par Pole 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,
-
11/10/2006 - 14h08
Re : Générer un entier aléatoire en C++
 Envoyé par Pole 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,
-
11/10/2006 - 14h35 Faith
Re : Générer un entier aléatoire en C++
 Envoyé par LicenceXP 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: (ou autre chose du même genre)
| | |