Générer des nombres aléatoire d'un tableau

Résolu
NLAH Messages postés 135 Statut Membre -  
NLAH Messages postés 135 Statut Membre -
Bonjour,
Je veut générer un tableau T[12] (100 fois); qui contient 12 nbr aléatoire dont 2 nombre sont égale à 0, j'ai a pensé a générer aléatoirement les deux position P1 et P2 de 0, et par la suite je voulais générer les autres éléménts de telle sorte que:
- j'aurai pas de redandance.
- première contrainte: ET que les éléments entre T[0] et T[p1] ne contiennent pas la valeur 5 et 4.
- deuxième contrainte:ET que les éléments entre T[p1+1] et T[p2] ne contiennent pas la valeur 5 et 6.
- troisième contrainte:ET que les éléments entre T[p2+1] et T[12] peuvent contenir toute autre valeur comprise entre 1 et 10.

lors de l'éxecution des 2 derniers contraintes, la console se bloque.
qu'est ce que je peux faire?
aidez moi SVP
Cordialement,

#include <stdlib.h>
#include <stdio.h>
#include <ctime>

int parcourT(int T[12], int nbr)
{
    int cmp=0;
    while(cmp<12)
    {
        if (T[cmp]==nbr) return 1;
        else cmp++;
    }
    return 0;
}


void population(int T[12]){

// intitialisation tableau des indices des zeros

int J[2];
J[0]=0;
J[1]=0;

for(int t=0; t<12;t++){
    T[t]=-1;
}

int i= rand()%10+1;
int j=rand()%10+1;;

do{
    j = rand()%10+1;

}
while(i==j || j== i+1 || j==i-1);

J[0]=i;
J[1]=j;

T[i]=0;
T[j]=0;


int p1,p2;
if(i<j){
    p1=i;
    p2=j;
}
else {
    p1=j;
    p2=i;
}

int z;


    for(int k=0; k<p1; k++){
    do{
        z=rand()%10+2;
    } while (parcourT(T,z)==1|| z==5 || z==4);
    T[k]=z;
}



for(int k=p1+1; k<p2; k++){
do{
        z=rand()%10+2;

    }while(parcourT(T,z)==1 || z==5 || z==6);
    T[k]=z;
    }

for(int k=p2+1; k<12; k++){
do{
        z=rand()%10+2;

    }while(parcourT(T,z)==1);
    T[k]=z;
    }


    }






int main()
{
    int T[12];
    for(int i=0; i<100; i++){

        population(T);

        for(int j=0; j<12; j++){
            printf("%d",T[j]);

        }
        printf("\n");

    }
}


4 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    Je te suggère de faire ceci, basé sur le code que tu as montré au départ:
    -) corriger les
    rand()%10+2
    comme signalé par le père.
    -) modifier la fonction population, et lui faire retourner un booléen
    -) à la fin de la fonction, retourner la valeur "vrai"
    -) entre les lignes 68 et 69, vérifier si il reste au moins un nombre différent de 5 et 6 qui n'est pas dans le tableau T. si il n'en reste pas, sortir de la fonction population en retournant la valeur "faux"
    -) dans main, ligne 96, rappeler la fonction population si elle retourne "faux"
    2
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    La logique suivante permettrait également d'éviter tout blocage:
    1) placer 5 dans une position aléatoire entre T[p2+1] et T[11]
    2) compléter les autres positions entre T[p2+1] et T[11]
    3) si 4 n'est pas placé, placer 4 dans une position aléatoire entre T[p1+1] et T[p2-1]
    4) compléter les (autres) positions entre T[p1+1] et T[p2-1] (en évitant de placer le 6)
    5) compléter les positions entre T[0] et T[p1-1]
    1
    1. NLAH Messages postés 135 Statut Membre 2
       
      Bonsoir,
      je vous remercie pour votre explications claires, j'ai essayé le code suivant en se basant sur votre idée.pouvez vous me proposez une amélioration?
      
      #include <stdlib.h>
      #include <stdio.h>
      #include <ctime>
      
      int parcourT(int T[12], int nbr)
      {
          int cmp=0;
          while(cmp<12)
          {
              if (T[cmp]==nbr) return 1;
              else cmp++;
          }
          return 0;
      }
      
      
      void population(int T[12]){
      
      // intitialisation tableau des indices des zeros
      
      int J[2];
      J[0]=0;
      J[1]=0;
      
      for(int t=0; t<12;t++){
          T[t]=-1;
      }
      
      int i= rand()%10+1;
      int j=rand()%10+1;;
      
      
      do{
          j = rand()%10+1;
      
      }
      while(i==j || j== i+1 || j==i-1);
      
      J[0]=i;
      J[1]=j;
      
      T[i]=0;
      T[j]=0;
      
      
      int p1,p2;
      if(i<j){
          p1=i;
          p2=j;
      }
      else {
          p1=j;
          p2=i;
      }
      
      int indic5=rand()%(11-p2)+(p2+1);
      int z;
      T[indic5]=5;
           for(int k=p2+1; k<indic5; k++) { //poste 3
              do {
                 z=rand()%10+1;
                                  }
           while (parcourT(T,z)==1);
          T[k]=z;
           }
           for(int k=indic5+1; k<12; k++) { //poste 3
              do {
                 z=rand()%10+1;
                                  }
           while (parcourT(T,z)==1);
          T[k]=z;
           }
      
        int indic4;
      if ( parcourT(T,4)==0){
          int indic4=rand()%(p2-1-p1)+(p1+1);
          T[indic4]=4;
      
                   for (int k=p1+1;k<indic4;k++){ //remplissage poste 2
                do {
                       z=rand()%10+1;
                                  }
           while (parcourT(T,z)==1);
          T[k]=z; }
      
      
      
      
      for (int k=indic4+1;k<p2;k++){ //poste 2
              do {
                       z=rand()%10+1;
                                      }
           while (parcourT(T,z)==1 );
          T[k]=z;
      
              } } else {
      
              for (int k=p1+1;k<p2;k++){ //poste 2
              do {
                       z=rand()%10+1;
                                      }
           while (parcourT(T,z)==1 );
          T[k]=z;
      
              }
      
              }
      
              for (int k=0;k<p1;k++){ //poste 2
              do {
                       z=rand()%10+1;
                                      }
           while (parcourT(T,z)==1 );
          T[k]=z;
      
              }
               }
      
      
      
      
      
      
      
      
      int main()
      {
          int T[12];
          for(int i=0; i<100; i++){
      
              population(T);
      
              for(int j=0; j<12; j++){
                  printf("  %d  ",T[j]);
      
              }
              printf("\n");
      
          }
      }
      
      
      
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > NLAH Messages postés 135 Statut Membre
         
        placement du 5 : parfait lignes 57 à 59
        placement du 4 : pourquoi ne pas faire
        do
        {
           z=rand()%12
        } while (T[z]!= -1) || (z < p1+1)
        T[z]=4

        placement du 6:
        do
        {
           z=rand()%12
        } while (T[z]!= -1) || (z > p1) && (z < p2+1)
        T[z]=6

        Je te laisse proposer comment placer les autres, en appliquant la logique proposée en https://forums.commentcamarche.net/forum/affich-34227613-generer-des-nombres-aleatoire-d-un-tableau#10.
        0
    2. NLAH Messages postés 135 Statut Membre 2
       
      je vous remercie infiniment, ça marche très bien.
      0
  3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    Je propose encore une logique différente, beaucoup plus simple, et, je pense, sans blocage possible: faire une boucle sur les nombres à placer, et utiliser
    rand()%12
    pour trouver une position libre et valide pour chaque nombre
    1) placer 0 dans p1 et p2 (comme tu fais pour le moment)
    2) placer le 5
    3) placer le 4 et le 6
    4) placer les autres nombres
    Tu peux ainsi éliminer la fonction
    parcourT
    .
    En fait, tu es parti dans la logique de faire une boucle sur les positions, et je pense plus logique de faire une boucle sur les nombres à placer.
    1
  4. Utilisateur anonyme
     
    Bonjour

    Es-tu conscient que tu remplis tes tableaux avec des nombres de 2 à 11, et non pas de 1 à 10 ?
    Mais ce n'est pas ce qui bloque ton programme.

    Il y a peut-être d'autres problèmes dans ton programme (je ne l'ai pas essayé), mais j'en vois au moins un :
    Pour tirer p1 et p2, tu utilises rand()%10+1. Ce nombre peut aller de 1 à 10.
    Prenons le cas où p2=10. Si le chiffre 6 n'a pas été placé dans le parcours 0..p1-1, tu te retrouveras avec un blocage. Quand tu seras rendu à k=9, tu auras placé tous les chiffres sauf le 5 et le 6. En effet, de k=0 à k=8 tu places 8 chiffres différents (sans compter le 0 à l'indice p1) mais tu n'as que 10 chiffres différents. Comme tu interdis le 5 et le 6, tu n'as plus aucun chiffre autorisé.
    Tu aurais pu t'en rendre compte avec ton debugger.
    0
    1. NLAH Messages postés 135 Statut Membre 2
       
      je vois, mais comment je peux résoudre ce problème ?
      0
    2. Utilisateur anonyme
       
      Que vois-tu ? Si tu as compris quelque chose, tu as la solution.
      0
    3. NLAH Messages postés 135 Statut Membre 2
       
      je comprend le problème, mais j'arrive pas à le résoudre.vu que j'ai pas de connaissances solides en c, et je sais pas s'il existe une méthode en C qui peut générer un nombre entre 1 et 10, et qu'elle prend comme contrainte qu'elle doit pas générer le 5 et 6 . je vous remercie d'avance.
      en fait, je suis pas spécialisée en informatique et je travaille actuellement sur un problème d'affectation.
      0
    4. Utilisateur anonyme > NLAH Messages postés 135 Statut Membre
       
      Il ne s'agit pas de connaissances en C, mais de bon sens. À la fin, il ne te reste que le 5 et le 6, mais tu interdis le 5 et le 6. Soit tu autorises d'autres nombres, soit tu supprimes l'interdiction.
      0
    5. NLAH Messages postés 135 Statut Membre 2 > Utilisateur anonyme
       
      j'ai essayé le code suivant, en traitant le cas critique (P1=8 et p2=10) mais il reste toujours le problème de redondance. SVP est ce que vous pouvez l'essayer sur votre pc si c'est possible.

      
      #include <stdlib.h>
      #include <stdio.h>
      #include <ctime>
      
      int parcourT(int T[12], int nbr)
      {
          int cmp=0;
          while(cmp<12)
          {
              if (T[cmp]==nbr) return 1;
              else cmp++;
          }
          return 0;
      }
      
      
      void population(int T[12]){
      
      // intitialisation tableau des indices des zeros
      
      int J[2];
      J[0]=0;
      J[1]=0;
      
      for(int t=0; t<12;t++){
          T[t]=-1;
      }
      
      int i= rand()%10+1;
      int j=rand()%10+1;;
      
      do{
          j = rand()%10+1;
      
      }
      while(i==j || j== i+1 || j==i-1);
      
      J[0]=i;
      J[1]=j;
      
      T[i]=0;
      T[j]=0;
      
      
      int p1,p2;
      if(i<j){
          p1=i;
          p2=j;
      }
      else {
          p1=j;
          p2=i;
      }
      
      int z;
      
      
          for(int k=0; k<p1; k++){
          do{
              z=rand()%10+1;
          } while (parcourT(T,z)==1|| z==5 || z==4);
          T[k]=z;
      }
      
      if (p1==8 && p2==10){
        for(int k=p1+1; k<p2; k++){
      T[k]==4;
          }
           for(int k=p2+1; k<11; k++){
      
                  z= rand()%(2) + 5;
           if(z==5) {
              T[k]==5;
              T[k+1]==6;
           }else{
              T[k]==6;
              T[k+1]==5;
           }
      
      
      }
      }else{
      
      for(int k=p1+1; k<p2; k++){
      int m=p2+1;
            z=rand()%10+1;
      
              if(z==5 || z== 6 ){
      
      
                      T[m]=z;
                      m++;
      
              }
                T[k]=z; }
      
      
      
      
      
      
      }
      
      }
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      int main()
      {
          int T[12];
          for(int i=0; i<100; i++){
      
              population(T);
      
              for(int j=0; j<12; j++){
                  printf(" %d ",T[j]);
      
              }
              printf("\n");
      
          }
      }
      
      
      
      
      
      
      0