Variables aléatoires

MaximeTestori Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   -
Salut à tous

J'ai trois variables doubles que je veux choisir aléatoirement mais compris entre un minimum>0 et un maximum qui sont pour chacune de ces variables différents.

Aidez moi s'il vous plait

8 réponses

Twinuts Messages postés 5375 Date d'inscription   Statut Modérateur Dernière intervention   2
 
Salut,

Je comprend pas bien la question, mais tu veux faire un random borné avec un min et un max ?
Si oui, c'est ça que tu veux ?:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


double my_rand(double min, double max) {
  return min + ((double)rand() / ((double)RAND_MAX / (max - min)));
}

int main(int argc, char** args) {
  int i = 0;
  srand(time(NULL));

  for(i = 0; i < 20; i++)
    printf("%lf\n", my_rand(8.f, 50.f));

  return 0;
}


0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Pour info, pas besoin de caster tout caster en double. Seul le cast de rand() suffit.
Sinon ce n'est pas rand()/RAND_MAX/(max-min)...
Il faut multiplier plutôt par max-min. Voir même max-min+1.
Et il faut rajouter min aussi.

printf("%lf\n", my_rand(8.f, 50.f));
Ce n'est pas %lf qu'il faut mettre mais %f.
Ce n'est pas 8.f ou 50.f qu'il faut mettre mais 8.0 et 50.0. Ou simplement 8. et 50..

Cdlt,
0
Twinuts Messages postés 5375 Date d'inscription   Statut Modérateur Dernière intervention   2
 
Salut,

"Il faut multiplier plutôt par max-min. Voir même max-min+1."
Mouep, j'ai fait ça comme ça mais visiblement il y a bien d'autres techniques:
https://stackoverflow.com/questions/10776073/random-double-between-min-and-max


"Ce n'est pas %lf qu'il faut mettre mais %f. "
umpfff,
printf float=%f
printf double=%lf
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
umpfff, printf float=%f
printf double=%lf

Faut revoir ses bases en C !
print(), comme toutes les fonctions à nombre variable d'arguments réalise une promotion automatique de certains types. Par exemple les float sont convertis en double.
De fait, dans le printf, le %f sert au double (pas besoin de %lf).
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
salut, sur ces questions de spécificateurs et de sous-spécificateurs de taille, je trouve que ce tableau présent sur cette page est très utile : http://www.cplusplus.com/reference/cstdio/printf/ (celui à la suite de "The length sub-specifier modifies the length of the data type. This is a chart showing the types used to interpret the corresponding arguments with and without length specifier (if a different type is used, the proper type promotion or conversion is performed, if allowed)")

en prime, il indique avec un code de couleur les sous-spécificateurs de taille introduits par C99 :-)


Dal
0
MaximeTestori Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
oui, par exemple une de mes variable s'appelle DiffTemps et la valeur aléatoire doit être comprise entre 5.56 et 27.25.
0
Twinuts Messages postés 5375 Date d'inscription   Statut Modérateur Dernière intervention   2
 
Salut,

Donc normalement la fonction "my_rand" devrait faire l'affaire.

my_rand(5.56, 27.25);

0
MaximeTestori Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Je ne la connaissais pas...
OK merci je vais essayer
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MaximeTestori Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Excuse moi est ce que tu peux m'expliquer cette partie?

nt main(int argc, char** args)
{
int i = 0;
srand(time(NULL));

for(i = 0; i < 20; i++)
printf("%lf\n", my_rand(8.f, 50.f));
0
Twinuts Messages postés 5375 Date d'inscription   Statut Modérateur Dernière intervention   2
 
Salut,

"my_rand" c'est la fonction que je t'ai faite lors de mon premier poste :)
soit:
double my_rand(double min, double max) {
  return min + ((double)rand() / ((double)RAND_MAX / (max - min)));
}


le main n'est là que pour l'exemple...
int main(int argc, char** args) {
  int i = 0; // variable pour la boucle for
  srand(time(NULL)); // initialisation de rand (obligatoire)

  for(i = 0; i < 20; i++) // boucle 20x pour afficher le resultat de la fonction my_rand
    printf("%lf\n", my_rand(8.f, 50.f)); // affiche un rand min=8.0 et max=50.0
  
  return 0;
}

0
MaximeTestori Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Merci mais comment je précise que cette valeur qu'il va me donner est pour la variable DiffTemps car il y a deux autres variables pour lesquelles je vais utiliser la même structure pour avoir également des nombre aléatoire mais avec des extremums différents?

Je dois être chiant non...
0
MaximeTestori Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Je ne suis pas très doué en programmation donc est ce que quelqu'un peut me dire pourquoi l'algorithme suivant ne fonctionne pas?????

#define Min1 5,56
#define Max1 27,25

#define Min2 500,0
#define Max2 4500,0

#define Min3 36,0
#define Max3 1151,08

double my_rand(Min1, Max1)
{
return Min1+(Max1-Min1)*((double)rand())/((double)RAND_MAX);
}
i = 0;
srand(time(NULL));

for(i = 0; i < 20; i++)
printf("%lf\n", my_rand(Min1.f, Max1.f));

double my_rand(Min2, Max2)
{
return Min2+(Max2-Min2)*((double)rand())/((double)RAND_MAX);
}
i = 0;
srand(time(NULL));

for(i = 0; i < 20; i++)
printf("%lf\n", my_rand(Min2.f, Max2.f));

double my_rand(Min3, Max3)
{
return Min3+(Max3-Min3)*((double)rand())/((double)RAND_MAX);
}
i = 0;
srand(time(NULL));

for(i = 0; i < 20; i++)
printf("%lf\n", my_rand(Min3.f, Max3.f));

Sachant que j'ai trois variables doubles que je veux choisir aléatoirement mais compris entre un minimum>0 et un maximum qui sont pour chacune de ces variables différents.

Apparemment il y a un probleme avec les double, my_rand, f et Max3...

Cordialement
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,

Déjà, enlève tous les #define.

return Min1+(Max1-Min1)*((double)rand())/((double)RAND_MAX);
Mets plutôt : return Min1+(double)rand() / RAND_MAX * (Max1-Min+1);

Tu as oublié le main(). Du coup, pleins d'instruction sont hors fonction...

printf("%lf\n", my_rand(Min2.f, Max2.f));
Ce n'est pas %lf, mais %f qu'il faut utiliser. Ensuite, les arguments sont pas bons :
my_rand(2.0, 5.0); par exemple pour appeler la fonction my_rand().
0
Twinuts Messages postés 5375 Date d'inscription   Statut Modérateur Dernière intervention   2
 
Aïe ça pique,

Si on reprend avec tes defines:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define Min1 5.56
#define Max1 27.25

#define Min2 500
#define Max2 4500

#define Min3 36
#define Max3 1151.08

double my_rand(double min, double max) {
  return min+(max-min)*((double)rand())/((double)RAND_MAX);
}

int main(int argc, char** argv) {
  srand(time(NULL));

  double var1 = my_rand(Min1, Max1);
  double var2 = my_rand(Min2, Max2);
  double var3 = my_rand(Min3, Max3);


  // utilisation de var1, var2, var3

  return 0;

}

0