Partage
  • Partager sur Facebook
  • Partager sur Twitter

srand(time(NULL)) pour couple de variable ?

X,Y

    20 mai 2017 à 19:53:03

    Voilà ce que j'ai fais

    srand(time(NULL));
    	X0 = (rand() % (2 - 1 + 1)) + 1;
    	Y0 = (rand() % (2 - 1 + 1)) + 1;
        
    	X1 = (rand() % (2 - 1 + 1)) + 1;
    	Y1 = (rand() % (2 - 1 + 1)) + 1;
        
    	X2 = (rand() % (2 - 1 + 1)) + 1;
    	Y2 = (rand() % (2 - 1 + 1)) + 1;
    
    	X3 = (rand() % (2 - 1 + 1)) + 1;
    	Y3 = (rand() % (2 - 1 + 1)) + 1;
    
    	X4 = (rand() % (2 - 1 + 1)) + 1;
    	Y4 = (rand() % (2 - 1 + 1)) + 1;
    
    	X5 = (rand() % (2 - 1 + 1)) + 1;
    	Y5 = (rand() % (2 - 1 + 1)) + 1;
    
    	X6 = (rand() % (2 - 1 + 1)) + 1;
    	Y6 = (rand() % (2 - 1 + 1)) + 1;
    
    	X7 = (rand() % (2 - 1 + 1)) + 1;
    	Y7 = (rand() % (2 - 1 + 1)) + 1;
    
    	X8 = (rand() % (2 - 1 + 1)) + 1;
    	Y8 = (rand() % (2 - 1 + 1)) + 1;
    

    J'aimerai que chaque couple X,Y soit différent des autres 

    pour avoir à la fin les valeurs de couple (X,Y) suivante: (0,0);(0,1);(1,0);(1,1);(2,0);(0,2);(2,1);(1,2);(2,2)

    une idée ? 

    -
    Edité par Game of throtinette 20 mai 2017 à 19:53:34

    • Partager sur Facebook
    • Partager sur Twitter
      20 mai 2017 à 19:58:21

      Salut,

      Euh, rand te donne des nombres au hasard, et donc ne fais pas du tout ce que tu veux. Pour avoir tes différents couples, déclares les à la main ou utilise un tableau pour tes variables et fais des boucles.

      • Partager sur Facebook
      • Partager sur Twitter
      Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
        20 mai 2017 à 21:18:22

        Salut,

        Heu... 2-1+1 ? C'est sérieux ou c'est pour voir si ta machine sait faire une addition ? Tu n'as pas de calculatrice sur ton PC ?

        Fais un tableau.

        Bon courage.

        • Partager sur Facebook
        • Partager sur Twitter

        Bonhomme !! | Jeu de plateforme : Prototype.

          20 mai 2017 à 23:49:30

          Ouai t'as raison  pour le 2-1+1 même si j'y avais pensé. Mais je peux pas faire un tableau je dois réutiliser ces valeur séparement après look:

           SDL_Rect tab[8];
              // case 1
              tab[0].x=X0*250;
              tab[0].y=Y0*250;
              tab[0].w=WIDTH;
              tab[0].h=HEIGHT;
              // case 2
              tab[1].x=X1*250;
              tab[1].y=Y1*250;
              tab[1].w=WIDTH;
              tab[1].h=HEIGHT;

          -
          Edité par Game of throtinette 21 mai 2017 à 0:04:19

          • Partager sur Facebook
          • Partager sur Twitter
            20 mai 2017 à 23:54:05

            Non, mais en fait, 2 - 1 + 1, c’est 2 quoi, pas la peine de mettre « -1 +1 ».

            • Partager sur Facebook
            • Partager sur Twitter
            Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
              21 mai 2017 à 0:05:32

              Mon problème en faite c'est que les valeur couple (ou coordonnées) se répète et du coup j'ai 2 fois la même case :/

              PS: yo@n97one a écrit:

              Non, mais en fait, 2 - 1 + 1, c’est 2 quoi, pas la peine de mettre « -1 +1 ».


              je sais ..... mais regarde nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;

              -
              Edité par Game of throtinette 21 mai 2017 à 0:06:53

              • Partager sur Facebook
              • Partager sur Twitter
                21 mai 2017 à 0:13:43

                > Mon problème en faite c'est que les valeur couple (ou coordonnées) se répète et du coup j'ai 2 fois la même case :/

                Et on a déjà répondu. Je répète ma réponse. Euh, rand te donne des nombres au hasard, et donc ne fais pas du tout ce que tu veux. Pour avoir tes différents couples, déclares les à la main ou utilise un tableau pour tes variables et fais des boucles.

                > je sais ..... mais regarde nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;

                Tu as essayé de comprendre cette formule où tu l’as juste copié comme ça ? Quand MIN vaut 1, alors MAX - MIN + 1 vaut MAX. De toutes, les manières, pour tirer un nombre au hasard entre deux nombres je préfère coder une fonction randint.

                double random(void)
                {
                    return (double)rand() / RAND_MAX;
                }
                
                int randint(const int a, const int b)
                {
                    return (int)(a + (b - a) * random());
                }
                

                -
                Edité par yo@n97one 21 mai 2017 à 0:15:08

                • Partager sur Facebook
                • Partager sur Twitter
                Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                  21 mai 2017 à 0:18:10

                  yo@n97one a écrit:

                  Non, mais en fait, 2 - 1 + 1, c’est 2 quoi, pas la peine de mettre « -1 +1 ».


                  je sais ..... mais regarde nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;

                  Je l'ai apprise par coeur pas plus d'info dans le cours en C d'openclassroom mais merci de l'explication 

                  En gros vous me dites de faire un tableau 2D: tab[i][j] mais ça marche pas pour moi, si je fait 

                  tab[2][1]= (rand() % 3;)

                  j'ai pas besoin de ça moi j'ai besoin que les couples (0,0);(0,1);(1,0);(1,1);(2,0);(0,2);(2,1);(1,2);(2,2) soit généré aléatoirement dans 2 variables différentes  sans doublon 

                  c'est impossible ? 

                  -
                  Edité par Game of throtinette 21 mai 2017 à 0:27:16

                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 mai 2017 à 0:26:49

                    Tu veux que je regarde quoi ? Donc, si je comprends bien, c’est bien ça, tu utilises cette formule sans essayer de comprendre ce qu’elle fait même après qu’on t’ai dit que le -1 + 1 ne servait à rien. Donc je vais expliquer comment elle marche. Pour ça, il y a deux choses à savoir.

                    • rand() retourne un nombre entre 0 et RAND_MAX.
                    • En faisant rand % x, on obtient un nombre entre 0 et x - 1.

                    Donc pour obtenir un nombre entre min et max, voici ce qu’on fait.

                    • On fait en sorte d’obtenir un nombre hasard entre 0 et max - min. Pour cela, on fait rand()% (max - min + 1). Tu remarqueras bien les parenthèses autour de max - min + 1. C’est cette opération qui est faite en première, donc si min vaut 1, autant écrire directement max.
                    • On ajoute min. hasard est entre 0 et max - min, donc hasard + min est compris entre min et max.

                    D’où la formule rand() % (MAX - MIN + 1) + MIN. Donc, non ce n’est vraiment pas la peine d’écrire 2 - 1 + 1.

                    EDIT : Si on a bien compris, tu veux tous les couples ?

                    #include <stdio.h>
                    
                    struct Point
                    {
                        int x, y;
                    };
                    
                    int main(void)
                    {
                        struct Point p[9] = {0};
                        
                        for(int i = 0; i < 3; i++)
                        {
                            for(int j = 0; j < 3; j++)
                            {
                                p[3 * i + j].x = i;
                                p[3 * i + j].y = j;
                            }
                        }   
                        for(int i = 0; i < 9; i++)
                            printf("%d - %d.\n", p[i].x, p[i].y);
                        return 0;
                    }
                    </stdio.h>

                    -
                    Edité par yo@n97one 21 mai 2017 à 0:38:31

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                      21 mai 2017 à 0:37:14


                      EDIT:

                      pourquoi tu fais ça 3 * i + j ?

                      et ouai j'ai besoin des couples mais faut qu'ils soient généré aléatoirement

                      En tout cas merci pour toutes ces precieuses explications 

                      -
                      Edité par Game of throtinette 21 mai 2017 à 0:50:40

                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 mai 2017 à 0:45:39

                        > mais je comprend pas c'est quoi ça: #include <stdio.h> et ça i &lt

                        C’est l’éditeur Markdown d’OC qui est vraiment de merde. J’ai corrigé.

                        > et pourquoi tu fais ça 3 * i + j ?

                        Essayes à la main avec un tableau et tu verras. En fait, j’ai linéarisé le tableau 2D. Dans le tableau 1D, la case 3 * i + j correspond à la case[i][j] du tableau 2D.

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                          21 mai 2017 à 0:55:13

                          yo@n97one a écrit:

                          > et pourquoi tu fais ça 3 * i + j ?

                          Essayes à la main avec un tableau et tu verras. En fait, j’ai linéarisé le tableau 2D. Dans le tableau 1D, la case 3 * i + j correspond à la case[i][j] du tableau 2D.


                          ah c'est excellent ça

                          mais c'est possible ou pas de générer aléatoirement ces couples ? dans 2 variables différentes genre je crée un code qui génére aléatoirement par exemple 

                          X1= 0 et Y1 = 0 puis aléatoirement X2 = 1 et Y2 = 2

                          -
                          Edité par Game of throtinette 21 mai 2017 à 0:58:13

                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 mai 2017 à 1:03:49

                            Oui c’est possible, mais si tu veux que tes couples soient différents, il faudra le vérifier et reprendre au hasard si ce n’est pas le cas. Le mieux est, si tu veux n couples différents, de garder le tableau et de tirer au hasard n cases différentes du tableau. Tes n couples seront ces les n points dans ces cases.

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                              21 mai 2017 à 1:17:34

                              Je comprend pas, je veux n couples différents.

                              Je tire n cases différentes mais comment je fais ça avec un srand ? ça me semble un peu bizarre. 

                              si dans un 

                              for(i = 0; i < 3; i++)

                              je fais un srand ? ça me semble compliqué et en plus de ça je dois supprimé cette valeur choisie de mon tableau pour qu'il ne la repioche pas, aïe aïe aïe 

                              et après "Tes n couples seront ces les n points dans ces cases." j'ai pas ça trop compris excuse moi 



                              • Partager sur Facebook
                              • Partager sur Twitter
                                21 mai 2017 à 1:37:34

                                #include <stdio.h>
                                
                                struct Point
                                {
                                    int x, y;
                                };
                                
                                int main(void)
                                {
                                    srand(time(NULL));
                                    struct Point p[9] = {0};
                                    
                                    for(int i = 0; i < 3; i++)
                                    {
                                        for(int j = 0; j < 3; j++)
                                        {
                                            p[3 * i + j].x = i;
                                            p[3 * i + j].y = j;
                                        }
                                    }   
                                    /* Maintenant, j’ai les neufs couples dans ma variable p. */
                                    int h = rand() % 9; 
                                    struct Point hasard = p[h]; 
                                }
                                

                                Ici, j’ai tiré un point au hasard en prenant un élément du tableau p au hasard. Pour tirer n couples, il te faut tirer n éléments du tableau au hasard.

                                -
                                Edité par yo@n97one 21 mai 2017 à 2:06:07

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                                  21 mai 2017 à 2:21:50

                                  Oui mais là si tu refais 
                                   int h = rand() % 9;
                                      struct Point hasard = p[h];

                                  2 fois d'affilé tu peux retomber sur le même couple et c'est ça mon problème en faite

                                  Moi je veux tirer au hasard 8 couples mais qu'ils soit tous différents les uns des autres

                                  -
                                  Edité par Game of throtinette 21 mai 2017 à 2:22:58

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    21 mai 2017 à 2:31:49

                                    Oui, la difficulté ici est de réussir à tirer 8 cases distinctes du tableau. Je te laisse chercher un peu comment faire. Aide : une solution est de mélanger le tableau et d’ensuite prendre ses 8 premières cases.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                                      21 mai 2017 à 3:09:15

                                      J'ai l'impression que si la demande de départ avait été plus claire, on serait rentré dans le vif du sujet un peu plus vite... Du coup je viens proposer une solution. Je vais décrire l'idée.

                                      Les valeurs des couples seront rangées dans deux tableaux, le tableau des x et le tableau des y. (On pourrait faire autrement, mais je reprends l'idée de gameofthrotinette.) Il y a un tableau X dont les éléments vont de X[0] à X[8], et un tableau Y dont les éléments vont de Y[0] à Y[8].

                                      Par ailleurs on va définir une fonction qui prend en entrée les tableaux X et Y, et un indice quelconque 'i' dans ces tableaux. Son but est d'affecter X[i] et Y[i] à l'une des neuf valeurs possibles. À l'intérieur de cette fonction, on commence par tirer au sort une certaine valeur entre 0 et 8, et ensuite on réalise l'affectation par exemple de cette façon :

                                      switch (valeur) // 'valeur' est le nombre aléatoire entre 0 et 8
                                      {
                                          case 0 :
                                              X[i] = 0 ; Y[i] = 0 ; break ;
                                          case 1 :
                                              X[i] = 1 ; Y[i] = 0 ; break ;
                                          case 2 :
                                              X[i] = 0 ; Y[i] = 1 ; break ;
                                          case 3 :
                                              X[i] = 1 ; Y[i] = 1 ; break ;
                                          case 4 :
                                              X[i] = 2 ; Y[i] = 0 ; break ;
                                          case 5 :
                                              X[i] = 0 ; Y[i] = 2 ; break ;
                                          case 6 :
                                              X[i] = 2 ; Y[i] = 1 ; break ;
                                          case 7 :
                                              X[i] = 1 ; Y[i] = 2 ; break ;
                                          case 8 :
                                              X[i] = 2 ; Y[i] = 2 ; break ;
                                      }
                                      

                                      Le problème, c'est que le nombre aléatoire entre 0 et 8 peut se répéter, or on veut tirer successivement les 9 nombres possibles. Comment faire ?

                                      Une solution : définir un tableau de 9 cases, qu'on va nommer 'libre', destiné à indiquer quand un nombre a déjà été utilisé. Au début, les cases libre[0] à libre[8] sont toutes affectées à 'true' (ou 1, pour ceux qui programment en C ancien). Cela signifie que les 9 valeurs possibles sont libres, qu'elles n'ont pas encore été utilisées. Mais chaque fois qu'on tire au sort une des valeurs entre 0 et 8, il faut affecter la case correspondante du tableau 'libre' à 'false' (ou 0 pour les fans de vieux C) : cette valeur est prise. De plus, avant d'affecter les X et les Y, il faut vérifier que la valeur choisie (aléatoirement) est toujours libre.

                                      Donc ça complique un peu la fonction. Avant le switch, il faut gérer ça, par exemple :

                                      do
                                      {
                                          valeur = /* on tire au sort un nombre entre 0 et 8 */
                                      } while (!libre[valeur]) // tant que 'valeur' n'est pas libre, on recommence
                                      
                                      /* arrivé ici, on a trouvé un 'valeur' libre */
                                      /* 1ère chose à faire : dire qu'il n'est plus libre, à présent */
                                      
                                      libre[valeur] = false ;
                                      
                                      /* Et maintenant on peut affecter X et Y avec la boucle décrite ci-dessus */
                                      


                                      L'inconvénient de cette méthode, c'est qu'à la fin on va perdre du temps pour tirer au sort parmi les deux valeurs libres restantes, et tout à la fin pour tomber sur la dernière valeur restante libre. 

                                      D'où une idée plus sophistiquée : on tire au sort un nombre N entre 0 et 8-i (où i est l'indice dans les tableaux X et Y) et on affecte à 'valeur' la N-ème valeur libre. Par exemple lorsqu'on veut calculer X[3], Y[3], on a déjà calculé les trois précédents, donc il y a déjà 3 valeurs qui ont à 'false' dans le tableau 'libre'. Celui-ci vaut, mettons :

                                      ..0......1.......2........3.......4......5.......6.......7......8

                                      vrai - vrai - faux - faux - vrai - vrai - faux - vrai - vrai

                                      On tire au sort un nombre entre 0 et 8-3, c'est-à-dire entre 0 et 5. Mettons 4. Eh bien on affecte à valeur l'indice du 5ème élément libre (4 est le 5ème nombre puisqu'on commence à 0), qui est ici l'indice 7.

                                      C'est plus compliqué à programmer, mais ça me paraît « mieux » (il n'y a plus besoin de la boucle do ... while).

                                      -
                                      Edité par robun 21 mai 2017 à 3:09:52

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        21 mai 2017 à 12:35:22

                                        attend je m'y met je te donnerai de mes nouvelles ça a l'air dur à comprendre. J'ai besoin de reflexion en tout cas merci bcp

                                        -
                                        Edité par Game of throtinette 21 mai 2017 à 12:35:50

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          21 mai 2017 à 13:17:17

                                          Bonjour,

                                          Ici on peut faire plus simple. On commence par générer les 9 possibilités, puis on mélange la table obtenue. Ensuite pour avoir un aléatoire on prend le 1er, pour un autre le 2nd, etc, ils seront tous différents.

                                              srand(time(NULL));
                                              struct Point p[3*3];
                                              // remplir
                                              for ( int i = 0 ; i < 3 ; i++ ) {
                                                  for( int j = 0 ; j < 3 ; j++ ) {
                                                      p[3 * i + j].x = i;
                                                      p[3 * i + j].y = j;
                                                  }
                                              }
                                              // melanger
                                              for ( int i = 0 ; i < 3*3 ; ++i ) {
                                                  int j = rand() % (3*3);
                                                  Point tmp = p[j];  // on echange le ieme au hasard
                                                  p[j] = p[i];
                                                  p[i] = tmp; 
                                              }
                                              // un au hasard
                                              p[0]
                                              // un autre au hasard et different
                                              p[1]
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          En recherche d'emploi.

                                            21 mai 2017 à 14:20:42

                                            Ah, c'est astucieux, ça !

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              21 mai 2017 à 14:58:10

                                              C'est la solution que je conseillais plus haut. ^^

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                                                21 mai 2017 à 17:14:42

                                                ça marche IMPEC merci à tous !!
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                srand(time(NULL)) pour couple de variable ?

                                                × 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