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
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
A voir également:
- Table de nombre aléatoire
- Table ascii - Guide
- Table des matières word - Guide
- Nombre facile - Télécharger - Outils professionnels
- En raison d'un nombre important d'échec de connexion snapchat - Forum Snapchat
- Tirage au sort excel aléatoire sans doublon ✓ - Forum Excel
4 réponses
yg_be
Messages postés
22624
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 mars 2024
1 461
Modifié par yg_be le 31/12/2016 à 14:39
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
-) 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
22624
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 mars 2024
1 461
Modifié par yg_be le 31/12/2016 à 15:02
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) 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]
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
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?
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"); } }
yg_be
Messages postés
22624
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 mars 2024
1 461
>
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
Modifié par yg_be le 1/01/2017 à 00:58
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.
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
2 janv. 2017 à 18:36
je vous remercie infiniment, ça marche très bien.
yg_be
Messages postés
22624
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 mars 2024
1 461
Modifié par yg_be le 31/12/2016 à 15:21
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
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.
Utilisateur anonyme
30 déc. 2016 à 23:54
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.
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.
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
31 déc. 2016 à 08:52
je vois, mais comment je peux résoudre ce problème ?
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
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.
en fait, je suis pas spécialisée en informatique et je travaille actuellement sur un problème d'affectation.
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
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.
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
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"); } }