Générer des nombres aléatoire d'un tableau
Résolu
NLAH
Messages postés
125
Date d'inscription
Statut
Membre
Dernière intervention
-
NLAH Messages postés 125 Date d'inscription Statut Membre Dernière intervention -
NLAH Messages postés 125 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Table de nombre aléatoire
- Table ascii - Guide
- Table des matières word - Guide
- Nombre de jours entre deux dates excel - Guide
- Nombre facile - Télécharger - Outils professionnels
- Table des caractères - Guide
4 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 583
Je te suggère de faire ceci, basé sur le code que tu as montré au départ:
-) corriger les
-) 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"
-) corriger les
rand()%10+2comme 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
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 583
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) 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?
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 faire
placement du 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.
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.
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 583
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
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
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.
rand()%12pour 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.
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.
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.
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"); } }