bonjour,
comment générer un nombre compris entre 5 et 10 (par exemple) en C ?
merci!
Version imprimable
bonjour,
comment générer un nombre compris entre 5 et 10 (par exemple) en C ?
merci!
(rand() / RANDMAX) => genere un nombre aléatoire entre 0 et 1Code:
1
2 (( rand() / RANDMAX) * 5) + 5)
PS : Il faut faire un srand(time()) (pas sur de l'exactitude ...) avant pour que le nombre aléatoire soit vraiment aléatoire
Non. rand()Citation:
Envoyé par djfrancky
Non. srand()Citation:
PS : Il faut faire un rand(time())
La reponse a la question d'origine est donnee dans la FAQ de ce forum.
ouep désolé j'ai corrigé un poil tard ;-)
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:
http://c.developpez.com/faq/c/?page=...ES_random_initCode:srand((int)time(NULL));
Jc
plus simple que :c'est de faire :Code:(( rand() / RANDMAX) * 5) + 5)
Code: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.Citation:
Envoyé par Ekinoks
http://emmanuel-delahaye.developpez....d/inc/random.h
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é :
Citation:
while ( x <5 )
{ x = rand()%10+1;
}
Le code suivant:
permet de tirer des nombes aleatoires entre 0 et N (bornes comprises) ou low et high(bornes comprises a nouveau). Il tient compte deCode:
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); }
- 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:
- utilise les bits de poids faiblesCode:randomValue = rand() % N;
- biais quand N ne divise pas RAND_MAX+1
- float peut avoir moins de precision que int, donc on perds des bitsCode:int randomValue = (int)((float)rand() / RAND_MAX * (N - 1));
- 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
- corrige le probleme des bit de poids faiblesCode:(int)((double)rand()/RAND_MAX * (num))
- 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)
- rand()/RANDMAX est un int, donc 0 ou 1...Code:(( rand() / RANDMAX) * 5) + 5)
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
Bonjour,
Montre nous se que tu as fait parce qu'à partir des info des posts précédent cela doit fonctionner.Citation:
Envoyé par Legogo
J'étais parti de ça
Mais j'ai pas trouvé comment l'utiliser ^^Code:
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); }
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):
Si on ne met que modulo Max ou Min, on va avoir un souciCode:
1
2 x = rand()%(Max-Min) + Min ;
Si Max est inclu, il faut rajouter un +1 dans le modulo.
Ce n'est pas une solution idéale :Citation:
Envoyé par ToTo13
Citation:
Envoyé par Jean-Marc.Bourguet
Si je veux associé une valeur entre 0 et 3 (entier) a une variable "a"Citation:
Envoyé par Legogo
ça fonctionne ?Code:
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);
Ca devrait. Tu as un problème?
pour utiliser la solution de Jean-Marc.Bourguet, ne pas oublier
Code:
1
2
3
4 #include <stdlib.h> #include <time.h> #include <assert.h>