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 -
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,
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
-
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 lesrand()%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" -
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]-
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"); } }- placement du 5 : parfait lignes 57 à 59
placement du 4 : pourquoi ne pas fairedo { 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.
-
-
-
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 utiliserrand()%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 fonctionparcourT
.
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. -
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.-
-
-
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. -
-
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"); } }
-