[C] Probleme nombres aléatoires tous differents

Probleme nombres aléatoires tous differents [C] - C - Programmation

Marsh Posté le 13-03-2005 à 11:20:34    

Voila,
 
J'ai un pb :
Je veux rentrer dans un tableau de n cases des chiffres aléatoires
Mais tous differents et borné entre 0 et n.
Mais le gros pb, c'est que je suis pas doué
 
Donc si vous pouviez m'aider un peu
Voici la partie en question
 
merci
 
J'ai mis a jour ce que j'avais fait , 3 post plus bas


Message édité par Profil supprimé le 14-03-2005 à 10:25:53
Reply

Marsh Posté le 13-03-2005 à 11:20:34   

Reply

Marsh Posté le 13-03-2005 à 12:17:00    


 
 
faut que tu imbriques une deuxieme boucle
 

Code :
  1. for(i=0 ; i<n ; i++)
  2. {
  3.     vrai = 1;
  4.     while (vrai)
  5.     {
  6.       var = rand();
  7.       for(j=0 ; j<i-1 && var != tab[j] ; j++);
  8.       if (i == j)
  9.       {
  10.         tab[i] = var;
  11.         vrai = 0;
  12.       }
  13.     }
  14. }


Message édité par moi23372 le 13-03-2005 à 12:22:36
Reply

Marsh Posté le 13-03-2005 à 14:02:51    

[:mad_oc@school] Tout d'abord , merci
 
 
J'ai essayer d'intégrer ce que tu viens de me dire a ma separation de mon programme
Mais je ne comprends absolument pas le coup du if ds la boucle for :D  
 
Je vais quand mm reepliquer mon pb :
Il faut mettre dans un tableau de c cases des chiffres aleatoire ( ex : X ) allant de 0 à n-1  
aprés , il me faut remplacer la valeur de la case X par un chiffre aléatoire compris entre 0 et 3
 
Voilou
 
Je met cette fois le code entier avec mes dernieres modification : Le probleme vient au niveau des deux boucles for imbriqués , l'affichage de la sequence a la fdin ainsi que le passage de chiffre a lettre, marche ss pb
 
 
 
VOICI le programme a jour :
 
#include <stdlib.h>
void mutation(char chaine[], int n,int memo[])
{
int i,j,t,k,b,h,o,c,mem,vrai,var,q,g;
printf("Maintenant, saisissez le pourcentage de taux de mutation qui affecte la chaîne d'ADN : " );
scanf("%d",&b);
if (b==0)
 {
 printf("Aucune mutation\n" );
 printf("\n" );
 }
 else
  {
  c=(int)(n*b/100);
  if(c==0)
   {
   c=1;
   printf("%d mutation(s) sur la chaîne de %d bases\n",c,n);
   }
   else
    {
    printf("%d mutation(s) sur la chaîne de %d bases\n",c,n);
    }
  printf("\n" );
  for(i=0;i<c;i++)
   {
   vrai=1;
   while(vrai=1)  //on met un chiffre aleatoire different ds chaque case de memo
    {
    var=(int)((double)rand()/((double)RAND_MAX+1.0)*n);
    for(o=0;o<i-1 && var!=memo[o];o++)
     {
     if( i==o )
      {
      memo[i]=var;
      vrai=0;
      }
     }
    }
   }
  for(i=0;i<c;i++)
   {
   memo[i]=k;
   q=chaine[k];
   chaine[k]=(int)(4.0*rand()/(RAND_MAX+1.0));
   if (q==chaine[k])
    {
    g=g+1;
    }
   if (chaine[k]==0)
    {
    chaine[k]='A';
    }
   if (chaine[k]==1)
    {
    chaine[k]='C';
    }
   if (chaine[k]==2)
    {
    chaine[k]='G';
    }
   if (chaine[k]==3)
    {
    chaine[k]='T';
    }
   }
  printf("\nVoici la chaine ADN ayant subi les %d mutations dont %d muette (substitution de la base par la meme base :\n",c,g);
  mem=0;
  for(j=0;j<n;j++)
   {
   printf("%c",chaine[j]);
   mem++;
   if(mem==3)
    {
    printf(" " );
    mem=0;
    }
   }
 
  }
printf("\n" );
printf("\n" );
}


Message édité par Profil supprimé le 13-03-2005 à 22:26:16
Reply

Marsh Posté le 13-03-2005 à 15:09:23    

si je comprends bien
 
tu as un tableau que tu dois remplir avec des nombres. Chaque case doit avoir un numéro différent de tous les autres, c'est bien ça?
 
ex: tab[5] = 2, 1, 3, 4, 0
 
c'est bien ça que tu veux? si c'est le cas, copie tel quel mon code... ça doit fonctionné...

Reply

Marsh Posté le 13-03-2005 à 22:31:17    


Simple problème d'algorithme.
 


#include <stdlib.h>
#include <stdio.h>
#include <time.h>
 
/* determiner si une valeur x est presente dans le tableau a de taille n
   retour : 0=non presente
            1=presente
*/
static int is_in (int x, int a[], size_t n)
{
   int in = 0;
   size_t i = 0;
 
   while (!in && i != n)
   {
      in = a[i] == x;
      i++;
   }
   return in;
}
 
int main (void)
{
   enum
   {
      N = 10
   };
 
   int memo[N] =
   {0};
   size_t i = 0;
 
   /* initialisation 'variable' du generateur aleatoire */
   srand ((unsigned) time (NULL));
 
   /* tirage pseudo-aleatoire de la premiere valeur, stockage en [0] */
   memo[i] = (int) ((double) rand () / ((double) RAND_MAX + 1.0) * N);
 
 
   /* tirage des autres valeurs */
   for (i = 1; i < N; i++)
   {
      do
      {
         memo[i] = (int) ((double) rand () / ((double) RAND_MAX + 1.0) * N);
      }
      while (is_in (memo[i], memo, i));
      /* on recommance tant que la valeur est deja dans le debut du tableau ([0]..[i-1]) */
 
   }
   printf ("\n" );
 
 
   /* affichage */
   for (i = 0; i < N; i++)
   {
      printf ("%3u", memo[i]);
   }
   printf ("\n" );
 
   /* ajoute pour voir la fenetre d'execution parce que j'utilise Dev-C++, */
   system ("pause" );
 
   return 0;
}


Message édité par Emmanuel Delahaye le 14-03-2005 à 11:12:43

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 13-03-2005 à 22:38:20    

printf ("\n" );
 
j'ai toujours trouvé que c'était écraser une mouche avec un marteau :)
 
longue vie a putchar

Reply

Marsh Posté le 13-03-2005 à 22:47:00    

:pt1cable:  
 
 
C'est super compliqué pour moi
 :D j'vais passer bcp de temps a essayer de déchiffrer , merci
 
 
Mais c'est dommage car je pense qu'on pouvait en modifiant u peu , faire marcher ce que moi23372
 
 
ps : taz , je suis un gros newbies ....  :D j'étudie de la biochimie/chimie moi , pas l'info  :(

Reply

Marsh Posté le 13-03-2005 à 22:53:28    


Touche pas à l'ADN. Mange bio.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-03-2005 à 10:36:38    

Emmanuel Delahaye a écrit :

Touche pas à l'ADN. Mange bio.


 
Merde, une blague d'informaticien  [:pamplemousse]  
 
Sinon , j'ai réfléchit a ce que tu as posté ,  [:carbonim]  et je comprends rien du tout  [:jeffman]  
 
 
 :cry:  :sweat:  

Reply

Marsh Posté le 14-03-2005 à 11:04:49    


Ok, j'ajoute les commentaires.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-03-2005 à 11:04:49   

Reply

Marsh Posté le 14-03-2005 à 14:36:23    

Emmanuel Delahaye a écrit :

Ok, j'ajoute les commentaires.


 
Il y a une légende urbaine qui dit que les commentaires sont utiles... mais ce n'est bien sûr qu'une légende !!!  :pt1cable:  

Reply

Marsh Posté le 14-03-2005 à 18:06:19    

J'ai envoyé le code par msg privé qui est nettement plus court et testé sous MS VISUAL STUDIO 6.0
 

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. #define MAX = 10
  5. time_t time (time_t *timer);
  6. void srand (unsigned int);
  7. int rand (void);
  8. void main ()
  9. {
  10. int n = MAX;
  11. int i, j, var, vrai;
  12. int tab[MAX];
  13. srand(time(NULL));
  14. for(i=0 ; i<n ; i++) 
  15.  vrai = 1; 
  16.  while (vrai) 
  17.  { 
  18.   var = rand()%n; 
  19.   for(j=0 ; j<i && var != tab[j] ; j++); 
  20.   if (i == j) 
  21.    vrai = 0; 
  22.  }
  23.  tab[i] = var;
  24. for (i = 0 ; i<n ; i++)
  25.  printf("%5d", tab[i]);
  26. }


Message édité par moi23372 le 14-03-2005 à 18:11:54
Reply

Marsh Posté le 14-03-2005 à 18:19:04    

# time_t time (time_t *timer);
# void srand (unsigned int);
# int rand (void);
 
 ?

Reply

Marsh Posté le 14-03-2005 à 19:32:32    

moi23372 a écrit :

J'ai envoyé le code par msg privé qui est nettement plus court et testé sous MS VISUAL STUDIO 6.0
 

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. #define MAX = 10
  5. time_t time (time_t *timer);
  6. void srand (unsigned int);
  7. int rand (void);
  8. void main ()
  9. {
  10. int n = MAX;
  11. int i, j, var, vrai;
  12. int tab[MAX];
  13. srand(time(NULL));
  14. for(i=0 ; i<n ; i++) 
  15.  vrai = 1; 
  16.  while (vrai) 
  17.  { 
  18.   var = rand()%n; 
  19.   for(j=0 ; j<i && var != tab[j] ; j++); 
  20.   if (i == j) 
  21.    vrai = 0; 
  22.  }
  23.  tab[i] = var;
  24. for (i = 0 ; i<n ; i++)
  25.  printf("%5d", tab[i]);
  26. }



 

  • A quoi servent les prototypes ajoutés
  • la macro est fausse (et inutile)
  • main() retourne int
  • srand() attend un unsigned int
  • génération pauvre de nombre pseudo
  • manque un "\n" pour terminer la ligne émise.


Sinon, c'est vrai que l'algo est plus compact.


Message édité par Emmanuel Delahaye le 14-03-2005 à 19:33:26

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed