à propos de la fonction aléatoire...

à propos de la fonction aléatoire... - C - Programmation

Marsh Posté le 20-01-2005 à 11:56:25    

Bonjour,
 
Je souhaite affecter une valeur aléatoire comprise entre 50 et 300 à une variable. J'ai appris qu'une fonction rand() existait, mais je n'arrive pas à lui préciser la fourchette. Pourriez-vous m'éclairer ?
 
PS : désolé pour cette question de gros débutant...  :ange:

Reply

Marsh Posté le 20-01-2005 à 11:56:25   

Reply

Marsh Posté le 20-01-2005 à 12:03:30    

Si tu fais un #define RAND_MAX 250 ca devrait te mettre la limite a 250, apres tu n'as plus qu'a ajouter 50 à la valeur que te retourne rand().
C'est a vérifier, je ne l'ai jamais utilisé mais normalement c'est ca.
 
Voili, voilou...

Reply

Marsh Posté le 20-01-2005 à 12:06:24    

pour avoir un nombre de 1 a 10 c'est ca
j=1+(int) (10.0*rand()/(RAND_MAX+1.0))
 
donc pour toi
j=50+(int) (250.0*rand()/(RAND_MAX+50.0))


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 20-01-2005 à 21:42:11    

KangOl a écrit :

pour avoir un nombre de 1 a 10 c'est ca
j=1+(int) (10.0*rand()/(RAND_MAX+1.0))
 
donc pour toi
j=50+(int) (250.0*rand()/(RAND_MAX+50.0))


 
 :heink:  :heink:  
 
pour avoir un nombre aléatoire réel entre 0 et 1 :

Code :
  1. d = double(rand())/RAND_MAX;


 
un nombre réel entre 0 et 10 :

Code :
  1. d = (double(rand())/RAND_MAX)*10;


 
un nombre entier entre 0 et 9 :

Code :
  1. i = floor((double(rand())/RAND_MAX)*10); /* ou cast */


 
un nombre entier entre 0 et 10 :

Code :
  1. i = floor((double(rand())/RAND_MAX)*11); /* ou cast */


Reply

Marsh Posté le 20-01-2005 à 21:48:08    

Il me semble que justement, rand() peut retourner RAND_MAX.
 
Donc il faut diviser par (RAND_MAX+1). D'ailleurs, dans pas mal d'implémentations, RAND_MAX est (une puissance de 2)-1.  Donc range*rand()/(RAND_MAX+1) ça revient à faire un décalage de bits vers la droite...
 
Pour le reste, fab++ a raison :)

Reply

Marsh Posté le 20-01-2005 à 21:57:31    

Lam's a écrit :

Il me semble que justement, rand() peut retourner RAND_MAX.
 
Donc il faut diviser par (RAND_MAX+1).


 
oui, ça peut retourner RAND_MAX, et alors ?
pourquoi diviser par RAND_MAX + 1 ? c'est faux.

Reply

Marsh Posté le 20-01-2005 à 22:02:44    

++fab a écrit :

un nombre entier entre 0 et 10 :

Code :
  1. i = floor((double(rand())/RAND_MAX)*11); /* ou cast */



 
si rand() renvoie RAND_MAX, ça vaudra:
(RAND_MAX/RAND_MAX)*11. Donc clairement pas un nombre compris entre 0 et 10 :D

Reply

Marsh Posté le 20-01-2005 à 22:08:20    

Lam's a écrit :

si rand() renvoie RAND_MAX, ça vaudra:
(RAND_MAX/RAND_MAX)*11. Donc clairement pas un nombre compris entre 0 et 10 :D


 
exa  :cry:  
mais si on ajoute +1, ça fout en l'air le générateur aléatoire  :(  
que faire ?

Reply

Marsh Posté le 20-01-2005 à 22:14:11    

++fab a écrit :

exa  :cry:  
mais si on ajoute +1, ça fout en l'air le générateur aléatoire  :(  
que faire ?


Bah non, ça fout rien en l'air. Ca assure que tu divises par l'entier directement supérieur. Et le générateur congruentiel pseudo-aléatoire continue à suivre la méthode dite de Khris B-Kâ.
 
L'autre méthode qu'on voit souvent, c'est:
blabla = X*rand()/RAND_MAX;
if (blabla==X)  
  blabla--;
 
Ca se vaut, vraiment. De toutes façons, si on avait besoin d'un générateur précis, c'est pas ça qu'on utiliserait...

Reply

Marsh Posté le 20-01-2005 à 22:19:39    

lam's >> [:itm]

Reply

Marsh Posté le 20-01-2005 à 22:19:39   

Reply

Marsh Posté le 20-01-2005 à 22:23:07    

Lam's a écrit :


L'autre méthode qu'on voit souvent, c'est:
blabla = X*rand()/RAND_MAX;
if (blabla==X)  
  blabla--;


 
 
au lieu de décrémenter, faire un nouveau tirage ?
 
C'est clairement inadapté, c'est évident :o

Reply

Marsh Posté le 21-01-2005 à 01:43:29    

rand()%251 + 50
 
J'avais mal lu entre 50 et 300  :o


Message édité par SBAM le 21-01-2005 à 01:46:39
Reply

Marsh Posté le 21-01-2005 à 08:24:24    

SBAM a écrit :

rand()%251 + 50


Oui, enfin ça, c'est la méthode naive... Des méthodes plus sérieuses ont été exposées plus haut...
 
http://www.eskimo.com/~scs/C-faq/q13.16.html


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 21-01-2005 à 08:51:59    

D'accord avec Delahaye, c'est une méthode extrèmement dangeureuse car le caractère aléatoire n'est plus vérifié (onb engendre plus souvent les petites valeurs). Seule solution correcte :
 
 
Réel entre 0 (compris) et 1 (non compris) :
 
rand()/(RAND_MAX + 1.0)
 
et si on cherche à générer un entier vraiement aléatoirement entre deux entiers a (comrpis) et b (non compris) :
 
a + (int) (floor(((double) ((b-a))*(rand()/(RAND_MAX + 1.0))));
 
Bon, j'ai mis un peu trop de parenthèse mais c'est juste pas sécurité et pour faire les cast !
 

Reply

Marsh Posté le 21-01-2005 à 10:20:49    

nathan_g a écrit :


Réel entre 0 (compris) et 1 (non compris) :
rand()/(RAND_MAX + 1.0)


 
pour les reels pas de + 1.0, ça c'est clair.
 
pour les entiers, j'ai cogité, et je raccroche à la thèse Khris B-Kâ.  :sol:  
1.0, c'est pile la bonne valeur à ajouter à RAND_MAX (qqsoit RAND_MAX).

Reply

Marsh Posté le 21-01-2005 à 10:45:25    

1.0, c'est pile la bonne valeur à ajouter à RAND_MAX (qqsoit RAND_MAX).  
 
=> En effet, comme rand() donne un entier, le + 1 permet d'obtenir des  réels régulièrement répartis entre 0 et RAND_MAX/(RAND_MAX+1), par pas de 1/(RAND_MAX+1)

Reply

Marsh Posté le 22-01-2005 à 14:44:39    

Et comment faire pour qu'à chaque éxécution du programme les valeurs soient différentes ?

Reply

Marsh Posté le 22-01-2005 à 14:56:10    

randomize() en début de programme


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 22-01-2005 à 14:58:12    

avec srand(x)
x peut etre pris en utilisant l'horloge (time(0)) par exemple.

Reply

Marsh Posté le 22-01-2005 à 21:23:50    

JagStang a écrit :

randomize() en début de programme


Ce n'est pas une fonction standard. srand() est standard.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 22-01-2005 à 22:06:51    

Il va p-e falloir mettre ca dans une FAQ, parce que cette question revient une fois par mois a peu pres.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed