Variables aléatoires

Fermé
MaximeTestori Messages postés 10 Date d'inscription mardi 20 mai 2014 Statut Membre Dernière intervention 28 avril 2015 - 20 mai 2014 à 08:18
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 21 mai 2014 à 10:45
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 dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 2
20 mai 2014 à 09:46
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
20 mai 2014 à 12:13
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 dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 2
21 mai 2014 à 08:12
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
21 mai 2014 à 09:51
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 21/05/2014 à 10:48
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 mardi 20 mai 2014 Statut Membre Dernière intervention 28 avril 2015
20 mai 2014 à 09:58
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 dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 2
20 mai 2014 à 10:01
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 mardi 20 mai 2014 Statut Membre Dernière intervention 28 avril 2015
20 mai 2014 à 10:11
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 mardi 20 mai 2014 Statut Membre Dernière intervention 28 avril 2015
20 mai 2014 à 10:18
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 dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 2
20 mai 2014 à 10:23
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 mardi 20 mai 2014 Statut Membre Dernière intervention 28 avril 2015
20 mai 2014 à 10:36
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 mardi 20 mai 2014 Statut Membre Dernière intervention 28 avril 2015
Modifié par MaximeTestori le 20/05/2014 à 13:27
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
20 mai 2014 à 16:11
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 dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 2
21 mai 2014 à 08:19
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