Ne pas générer deux mêmes nombres aléatoires à la suite

Résolu
Bushizo Messages postés 109 Statut Membre -  
Bushizo Messages postés 109 Statut Membre -
Bonjour à tous,
Je suis en train de programmer un logiciel qui a besoin de tirer des nombres aléatoirement, jusque là, pas de problème, mais il faut ne pas tirer deux fois le même. Or le même nombre peut être tiré plusieurs fois du moment que les deux mêmes nombre ne se suivent pas :
ex : 145684556399 : pas bon plusieurs mêmes nombres se suivent
autre ex : 48757524841 : ok,il y a plusieurs fois le même nombre, mais pas à la suite.

Avez-vous une idée de comment coder une fonction capable de faire ceci en C?
Merci d'avance,
Bushizo

3 réponses

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut Bushizo,

    Une simple boucle while à insérer dans ta boucle effectuant les tirages permet de faire ceci :

    Tant que tirage courant == tirage précédent
    faire un nouveau tirage
    Fin tant que

    Je ne vois pas trop où est la difficulté pour toi.

    Montre ton code et dis nous là où tu bloques.

    Dal
    0
  2. jisisv Messages postés 3678 Statut Modérateur 936
     
    Un petit code vite bidouillé et à améliorer:
    #include <stdlib.h>
    #include <stdio.h>
    
    int isvalid(int value)
    {
      char buffer[4];
      char *ptr = buffer +2,  *pptr= buffer+1;
    
      sprintf(buffer, "%3d", value);
    
      while( (pptr >= buffer) && (*pptr != ' ') )
        {
          //      printf("%c%c\n", *pptr, *ptr);
          if( *ptr == *pptr)
     return 1;
          ptr = pptr;
          pptr--;
        }
     
      return 0;
    }
      
    int main(int argc, char **argv)
    {
      const int range=1000;
      int maxiter;
      int iter, value;
    
      if( argc <2)
        return(EXIT_FAILURE);
      maxiter = atoi(argv[1]);
    
      for(iter=0; iter <maxiter; iter++)
        {
          value = rand() % range;
          if (isvalid(value) ==1)
              printf("|%3d|\n", value);
        }
      return 0;
    }


    Exécution:
    johand@bata:~/src/CCM$ gcc -Wall -o random2 random2.c ; ./random2 10
    |886|
    |777|
    |335|


    Est tu certain qu'il s'agit de générer des entiers aléatoires ou des chaînes numériques de longueur fix ?

    Gates gave ^W sold you the windows.
    GNU gave us the whole house.(Alexandrin)
    0
    1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Salut jisiv,

      Si on tire des chiffres (donc des nombres de 0 à 9) à la suite pour fabriquer le nombre à obtenir, c'est beaucoup plus facile de contrôler qu'il n'y a pas de répétitions consécutives, comme proposé .

      En ce qui concerne ton code, à l'exécution, on dirait que tu obtiens l'effet opposé à celui recherché, à moins que j'aie raté un truc... ?

      :-)

      Dal
      0
    2. jisisv Messages postés 3678 Statut Modérateur 936
       
      Oui, bien sur, je n'affiche que les nombres avec coïncidences, il suffit d'inverser la condition en ligne 36 !
      0
  3. Bushizo Messages postés 109 Statut Membre 10
     
    Bonjour à tous et merci de vos réponses, désolé de ne pas avoir pu répondre plus tôt.
    Je vais donc essayer les techniques que vous m'avez proposé et vous dirai de laquelle je me suis servi.
    Merci encore :)
    0
    1. Bushizo Messages postés 109 Statut Membre 10
       
      Bon alors avec vos conseils j'ai fait ceci :

      #include <stdio.h>
      #include <stlib.h>

      int main()
      {
      const int MIN = 0, MAX = 9;
      srand(time(NULL));
      int i = 0;
      int nombres[9];
      nombres[0] = 1;
      nombres[1] = 2;
      nombres[2] = 3;
      nombres[3] = 4;
      nombres[4] = 5;
      nombres[5] = 6;
      nombres[6] = 7;
      nombres[7] = 8;
      nombres[8] = 9;
      int ancienTirage = 0;
      for(i = 0; i <= 15; i++)
      {

      int tirage = (rand() % (MAX - MIN + 1));
      while(tirage == ancienTirage)
      {
      tirage = (rand() % (MAX - MIN + 1));
      }
      printf("%d", nombres[tirage]);
      ancienTirage = tirage;
      }

      return 0;

      }


      Il y a cependant un problème que je ne comprend pas : quand je demande d'afficher les nombres tirés au hasard tout marche comme je veux mais quand je demande d'afficher la valeur de l'indice du tableau comme sur les code que j'ai mis des fois j'ai des 1 qui s'affichent en double...
      0
      1. Bushizo Messages postés 109 Statut Membre 10 > Bushizo Messages postés 109 Statut Membre
         
        Ok, j'ai fini par résoudre le problème en changeant
        "ancienTirage = 0;"
        en
        "= -1;"

        Et j'ai mis un espace après
        "%d "
        et là ça marche! Encore une fois, merci beaucoup!

        Bushizo
        0