Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction rand

Intervalles

    5 décembre 2006 à 12:49:22

    Bonjour à tous,

    Serait-il possible avec la fonction rand -ou autre- de prendre un chiffre aléatoire mais entre des intervalles, je m'explique, je voudrais par exemple prendre un nombre qui se situe entre 0 et 10 ou 20 et 30

    [0, 10] U [20, 30]

    Cela est-il possible ?

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      5 décembre 2006 à 13:02:54

      C'est peut-être pas très propre mais tu peux faire quelque chose comme ça :

      int a;
      do
      {
         a = fonctionAleatoire(0, 30);
      }while(a < 20 && a > 10);
      • Partager sur Facebook
      • Partager sur Twitter
        5 décembre 2006 à 14:29:55

        Ah oui d'accord je vois le concept !
        Merci pour cette suggestion !
        • Partager sur Facebook
        • Partager sur Twitter
          5 décembre 2006 à 15:59:54


          int a = (fonctionAleatoire (0, 1)) ?
                  fonctionAleatoire (0, 10) : fonctionAleatoire (20, 30);
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            5 décembre 2006 à 16:46:50

            Bah essaie ça (non testé)

            int aleatoireIntervale(int min1, int max1, int min2, int max2)
            {
                static int initialise = 0;
                int nb;
               
                if(!initialise)
                {
                    srand(time(NULL));
                    initialise = 1;
                }

                nb = rand() % ((max1 - min1) + (max2 - min2));
               
                if(nb <= (max1 - min1))
                    return (nb + min1);
                else
                    return (nb + min1 + (min2 - max1));
            }
            • Partager sur Facebook
            • Partager sur Twitter
              5 décembre 2006 à 17:05:52

              Nigloo, ton code n'est pas assez flexible dans la mesure où l'on veut avoir un rand dans n intervalles.
              Ton code n'est valide que pour n = 2 ;)
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                5 décembre 2006 à 17:14:37

                Bah oui, si on veut plus d'interval, il faut adapter la fonction.

                Sinon je ne sais pas faire de fonction avec un nombre indéterminé de paramètres (comme printf)
                • Partager sur Facebook
                • Partager sur Twitter
                  5 décembre 2006 à 17:24:11

                  Citation : Nigloo

                  Sinon je ne sais pas faire de fonction avec un nombre indéterminé de paramètres (comme printf)



                  Tu n'en as nul besoin pour faire la fonction en question ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 décembre 2006 à 17:24:23

                    Renseigne toi sur les ellipses.
                    Mais il y a bien plus simple,les tableaux.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      5 décembre 2006 à 17:33:02

                      bah j'ai pensé au tableau mais bon en pensant au code, il me faudrait des boucle et j'ai pas vraiment pas la tête à ça.
                      Surtout que moi même un problème avec un prog qui bouffe beaucoups de mémoire.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 décembre 2006 à 17:40:33

                        un moyen serait de récupérer en paramètre un tableau qui aurait un nombre pair de valeur :
                        // la valeur doit se trouver dans un des intervalles suivant :
                        // 10-20
                        // 30-45
                        // 87-89
                        int tab[] = {10,20,30,45,87,89};

                        ensuite on le transforme en :
                        (20-10)+(45-30)+(89-87) = 11 + 16 + 3 = 40 (ex : 11 car 10 et 20 compris)
                        puis faire un rand entre 1 et 40 inclus puis de le remettre en fonction du tableau.
                        3 donnerait 12
                        8 donnerait 30
                        35 donnerait 43
                        39 donnerait 88
                        ...ect...
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          5 décembre 2006 à 18:00:59

                          Oui ça je sais c'est justement pour le "remettre en fonction" que ça pose problème.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 décembre 2006 à 19:47:04

                            J'ai pondu ceci ^^ :
                            #include <stdio.h>
                            #include <stdlib.h>
                            #include <time.h>

                            struct intervalle
                            {
                               int min;
                               int max;
                            };

                            int _rand (int min, int max)
                            {
                                return (int) (min + ((float) rand() / RAND_MAX * (max - min + 1)));
                            }

                            int _interval_rand (struct intervalle* this, int intervals_nb)
                            {
                               int interval = _rand (0, intervals_nb - 1);
                               return _rand (this[interval].min, this[interval].max);
                            }

                            int main (void)
                            {
                               srand (time (NULL));

                               struct intervalle this[] = { {0, 10}, {20, 30} };

                               printf ("%d\n",
                                  _interval_rand (this, sizeof this / sizeof (struct intervalle)));

                               return 0;
                            }
                            • Partager sur Facebook
                            • Partager sur Twitter
                              5 décembre 2006 à 20:03:43

                              Je n'ai pas bien le temps ce soir de voir tout ca, mais je remercie infinimement pour le temps passé à créer ces fonctions pour m'aider. J'analyse ça demain :)

                              Merci encore, c'est bien sympa :D
                              • Partager sur Facebook
                              • Partager sur Twitter
                                5 décembre 2006 à 20:28:25

                                Citation : -Phantom-

                                Serait-il possible avec la fonction rand -ou autre- de prendre un chiffre aléatoire mais entre des intervalles, je m'explique, je voudrais par exemple prendre un nombre qui se situe entre 0 et 10 ou 20 et 30

                                [0, 10] U [20, 30]

                                Cela est-il possible ?

                                Merci d'avance


                                Donc une plage continue de 22 valeurs, soit [0 à 21]. Ca, tu sais faire. Ensuite, tu traites la discontinuité comme ceci : ce qui vaut plus que 10 [11-21], tu le décales de 9, soit [20-30].

                                Simple arithmétique de base...

                                Si c'est plus complexe, tu fais un tableau de taille N contenant les valeurs étranges non reliées entre elles (des caractères par exemple) et tu tires l'index dans l'interval[0 N-1].
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Music only !
                                  5 décembre 2006 à 21:37:55

                                  -ed- > c'est ce que j'ai fait quelques messages plus haut ;)
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Fonction rand

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown