Bonjour, c'est encore moi !
Je cherche aujourd'hui à pouvoir générer un entier aléatoire compris entre 1 et 100 : comment faire ?
-----
Bonjour, c'est encore moi !
Je cherche aujourd'hui à pouvoir générer un entier aléatoire compris entre 1 et 100 : comment faire ?
Utilise la fonction rand()
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,
Simplement 1+rand()%99
Mais si tu veux une vraie répartition, il vaut mieux 1+(int)((float)rand()/32767*99)
Pole.
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
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,
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,
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,
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 ?
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.
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.
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,
Non: pseudo aléatoire veut juste dire qu'avec une même initialisation, la suite des nombres sera la même.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 ?
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)Code:srand(time(NULL));
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.
(Excusez-moi pour ceux qui n'ont pas Windows pour le "system(pause)")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"); }
Et voilà. Pas de cycle plus petit que 100000.
mmy:Tu parles de quelle formule?
Pole.
Oops là, je l'avais sauté.
Pole
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.
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.
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
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.
Bonjour,
La formule dépend si a et/ou b sont compris... Il y a des + ou -1 à mettre selon les cas...
Cordialement,
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.