Variables aléatoires

MaximeTestori Messages postés 12 Statut Membre -  
[Dal] Messages postés 6122 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

  1. Twinuts Messages postés 27 Date d'inscription   Statut Membre 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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    2. Twinuts Messages postés 27 Date d'inscription   Statut Membre 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
    3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    4. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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
  2. MaximeTestori Messages postés 12 Statut Membre
     
    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
  3. Twinuts Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   2
     
    Salut,

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

    my_rand(5.56, 27.25);
    

    0
  4. MaximeTestori Messages postés 12 Statut Membre
     
    Je ne la connaissais pas...
    OK merci je vais essayer
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. MaximeTestori Messages postés 12 Statut Membre
     
    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
  7. Twinuts Messages postés 27 Date d'inscription   Statut Membre 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
  8. MaximeTestori Messages postés 12 Statut Membre
     
    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
  9. MaximeTestori Messages postés 12 Statut Membre
     
    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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    2. Twinuts Messages postés 27 Date d'inscription   Statut Membre 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