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

Résolu/Fermé
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 - 30 déc. 2016 à 23:07
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 - 2 janv. 2017 à 18:36
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");

    }
}


A voir également:

4 réponses

yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474
Modifié par yg_be le 31/12/2016 à 14:39
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
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474
Modifié par yg_be le 31/12/2016 à 15:02
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
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 2
31 déc. 2016 à 23:13
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
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474 > NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017
Modifié par yg_be le 1/01/2017 à 00:58
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
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 2
2 janv. 2017 à 18:36
je vous remercie infiniment, ça marche très bien.
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474
Modifié par yg_be le 31/12/2016 à 15:21
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
Utilisateur anonyme
30 déc. 2016 à 23:54
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
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 2
31 déc. 2016 à 08:52
je vois, mais comment je peux résoudre ce problème ?
0
Utilisateur anonyme
31 déc. 2016 à 09:13
Que vois-tu ? Si tu as compris quelque chose, tu as la solution.
0
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 2
Modifié par nihadlahit le 31/12/2016 à 12:01
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
Utilisateur anonyme > NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017
Modifié par le père. le 31/12/2016 à 12:12
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
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 2 > Utilisateur anonyme
31 déc. 2016 à 14:09
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