bonjour,
comment générer un nombre compris entre 5 et 10 (par exemple) en C ?
merci!
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 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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()Envoyé par djfrancky
Non. srand()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_init
Code : Sélectionner tout - Visualiser dans une fenêtre à part srand((int)time(NULL));
Jc
plus simple que :c'est de faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part (( rand() / RANDMAX) * 5) + 5)
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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.Envoyé par Ekinoks
http://emmanuel-delahaye.developpez....d/inc/random.h
Pas de Wi-Fi à la maison : CPL
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é :
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 de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 faibles
Code : Sélectionner tout - Visualiser dans une fenêtre à part randomValue = rand() % N;
- biais quand N ne divise pas RAND_MAX+1
- float peut avoir moins de precision que int, donc on perds des bits
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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 faibles
Code : Sélectionner tout - Visualiser dans une fenêtre à part (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 : Sélectionner tout - Visualiser dans une fenêtre à part (( rand() / RANDMAX) * 5) + 5)
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.
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.Envoyé par Legogo
J'étais parti de ça
Mais j'ai pas trouvé comment l'utiliser ^^
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 souci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2x = rand()%(Max-Min) + Min ;
Si Max est inclu, il faut rajouter un +1 dans le modulo.
Consignes aux jeunes padawans : une image vaut 1000 mots !
- Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
- Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
-ton poste tu dois marquer quand la bonne réponse tu as obtenu.
Ce n'est pas une solution idéale :Envoyé par ToTo13
Envoyé par Jean-Marc.Bourguet
Si je veux associé une valeur entre 0 et 3 (entier) a une variable "a"Envoyé par Legogo
ça fonctionne ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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?
Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.
pour utiliser la solution de Jean-Marc.Bourguet, ne pas oublier
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #include <stdlib.h> #include <time.h> #include <assert.h>
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager