Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2976 connectés 

  FORUM HardWare.fr
  Programmation
  C

  à propos de la fonction aléatoire...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

à propos de la fonction aléatoire...

n°957277
tsing
Jouez à WarCraft III !
Posté le 20-01-2005 à 11:56:25  profilanswer
 

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:

mood
Publicité
Posté le 20-01-2005 à 11:56:25  profilanswer
 

n°957288
colonelhat​i
Posté le 20-01-2005 à 12:03:30  profilanswer
 

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...

n°957293
KangOl
Profil : pointeur
Posté le 20-01-2005 à 12:06:24  profilanswer
 

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...
n°957914
++fab
victime du syndrome IH
Posté le 20-01-2005 à 21:42:11  profilanswer
 

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 */


n°957917
Lam's
Profil: bas.
Posté le 20-01-2005 à 21:48:08  profilanswer
 

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 :)

n°957933
++fab
victime du syndrome IH
Posté le 20-01-2005 à 21:57:31  profilanswer
 

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.

n°957941
Lam's
Profil: bas.
Posté le 20-01-2005 à 22:02:44  profilanswer
 

++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

n°957948
++fab
victime du syndrome IH
Posté le 20-01-2005 à 22:08:20  profilanswer
 

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 ?

n°957955
Lam's
Profil: bas.
Posté le 20-01-2005 à 22:14:11  profilanswer
 

++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...

n°957964
chrisbk
-
Posté le 20-01-2005 à 22:19:39  profilanswer
 

lam's >> [:itm]

mood
Publicité
Posté le 20-01-2005 à 22:19:39  profilanswer
 

n°957971
++fab
victime du syndrome IH
Posté le 20-01-2005 à 22:23:07  profilanswer
 

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

n°958178
SBAM
Best recording of rach 3.
Posté le 21-01-2005 à 01:43:29  profilanswer
 

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


Message édité par SBAM le 21-01-2005 à 01:46:39
n°958215
Emmanuel D​elahaye
C is a sharp tool
Posté le 21-01-2005 à 08:24:24  profilanswer
 

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/
n°958221
nathan_g
Posté le 21-01-2005 à 08:51:59  profilanswer
 

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 !
 

n°958258
++fab
victime du syndrome IH
Posté le 21-01-2005 à 10:20:49  profilanswer
 

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).

n°958272
nathan_g
Posté le 21-01-2005 à 10:45:25  profilanswer
 

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)

n°959270
fafounet
Posté le 22-01-2005 à 14:44:39  profilanswer
 

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

n°959275
jagstang
Pa Capona ಠ_ಠ
Posté le 22-01-2005 à 14:56:10  profilanswer
 

randomize() en début de programme


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
n°959276
++fab
victime du syndrome IH
Posté le 22-01-2005 à 14:58:12  profilanswer
 

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

n°959483
Emmanuel D​elahaye
C is a sharp tool
Posté le 22-01-2005 à 21:23:50  profilanswer
 

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/
n°959519
el muchach​o
Comfortably Numb
Posté le 22-01-2005 à 22:06:51  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  à propos de la fonction aléatoire...

 

Sujets relatifs
[BATCH] Suppression de fichier en fonction du tempsfonction delay ?
Fonction MAIL marche plus[EXCEL]Fonction fréquence et variable qualitative
Comment marche la fonction fseek()??fonction appartient ?
Appel de fonction static dans fonction templaterecherche d'une fonction
appelle une fonction du shell unix dans mawk[JAVA] RMI : Le serveur peut-il exécuter une fonction cliente ?
Plus de sujets relatifs à : à propos de la fonction aléatoire...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR