Autorisation : Membre
Nb de messages : 3
Inscrit le : Jeu 31 Oct 2013, 11:37
Posté le : Jeu 31 Oct 2013, 11:41
Bonjour tout le monde, ceci est mon premier message d'aide, et aussi mon premier message sur ce site qui m'a l'air très sympathique
Voici donc mon problème : J'aimerais créer un programme, qui lance un dé à 6 faces en boucle, jusqu'à ce qu'il ait obtenu les 6 faces, et ensuite, qu'il m'indique le nombre de lancés de dé réalisé.
J'ai des bases en programmation, à mon avis, pour ce programme il me faut utiliser une liste, mais je ne vois pas vraiment comment l'exposer :/
J'ai donc besoin de votre aide pour me guider !
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Jeu 31 Oct 2013, 15:50
Précise ton modèle de TI, cela nous aide.
Je décompose ton problème :
-tu as besoin d'un aléa équilibré dont on observera six états
-tu as besoin d'une boucle et d'un test de sortie pour vérifier que les six faces ont été générées
-pour retenir les résultats, tu devrais associer chaque terme de la liste à une face et une valeur 0 ou 1 pour signaler la présence du résultat
-tu as besoin d'analyser les résultats (la liste dans mon exemple) pour écrire la condition de sortie
L'aléa d'une TI est basé sur la fonction rand/NbrAléat qui donne un nombre X tel que 0<X<1. On peut observer des intervalles de valeurs pour définir chaque état, mais il est bien plus simple de le multiplier puis d'en prendre la partie entière pour définir des états discrets plutôt que décimaux. En effet 0<AX<A
La TI82 ne permet pas de faire autrement, mais la ti82stat et les suivantes disposent de fonctions dédiées à d'autres calculs aléatoires, dont randInt/entAléa pour des entiers.
1+int 6rand
randInt(1,6)
Je te propose d'initialiser avec une liste de 6 termes nuls.
On peut affecter directement, ou donner une taille ("dimension" pour la TI) puis remplir de zéros, ou encore vider la liste puis donner la taille 6.
Code
{0,0,0,0,0,0->L1
// ou
6->dim(L1
Fill(0,L1 // Remplir(0,L1
// ou
ClrList L1 // EffListe L1
6->dim(L1
On peut aussi utiliser DelVar/EffVar pour supprimmer la liste plutôt que de la vider, mais je n'aime pas ça car cela perturbe l'éditeur de listes. Dans tous les cas il faut dimensionner après.
Je continue d'utiliser la liste de la même manière, voici ce que je propose comme stockage de résultat :
Code
1->L1(randInt(1,6 // stocke 1 dans une case aléatoirement
La condition de sortie peut être obtenue avec une boucle.
Je recommande la boucle For et une variable.
Code
1->A
For(B,1,6
A and L1(B->A // simplifiable ici avec un produit AL1(B
End
// A contient 1 si tous les résultats sont présents (car tous les termes sont non-nuls) et contient 0 sinon
J'optimise avec la variable Ans/Rép. A la fin on peut lire Ans au lieu de A.
Code
1
For(B,1,6
AnsL1(B
End
Si veux savoir ce que fait mon For en détail (on ne peut pas utiliser Ans avec ça) :
Code
1->A
1->B
While B<=6
A and L1(B->A
B+1->B
End
Si on crois gagner du temps en s'arrêtant dès qu'un terme est nul, on ajoute une condition au While :
Code
1->A
1->B
While B<=6 and A // "While B<=6 and A=/=0" correspond
A and L1(B->A
B+1->B
End
Je propose de faire encore plus concis avec un calcul. J'aime min dans ce cas.
Code
min(L1->A
La boucle la plus simple à utiliser pour la génération dans ce cas est Repeat car :
-elle ne scrute pas la condition au début.
-elle convient déjà parfaitement à ma convention 1=fini / 0=pasfini
Code
0->C
Repeat A // Repeat A=/=0
//calcul aléatoire
C+1->C // compte les lancers
//condition stockée dans A
End
Disp C // comme c'est la dernière ligne, le Disp est facultatif : "C"
Programme final.
Code
ClrList L1
6->dim(L1
0->C
Repeat min(L1
1->L1(randInt(1,6
C+1->C
// je ne stocke pas dans A, j'ai juste le calcul dans l'entête du Repeat
End
C
---------------------- ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)
Autorisation : Membre
Nb de messages : 3
Inscrit le : Jeu 31 Oct 2013, 11:37
Posté le : Jeu 31 Oct 2013, 18:45
Merci beaucoup pour ta réponse très constructive, j'ai réussi, en 7 lignes de code ça marche !
Et désolé de ne pas avoir préciser le support, je suis sur TI-82