Poster un nouveau sujet Poster une réponse
Programme de lancé de dé (obtenir les 6 faces)
Auteur Message
nefurious



Autorisation : Membre
Nb de messages : 3
Inscrit le : Jeu 31 Oct 2013, 11:37
Posté le : Jeu 31 Oct 2013, 11:41   Citer 

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 happy.gif

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 !

 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Jeu 31 Oct 2013, 15:50   Citer 

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

Consulte mon tutoriel sur les tests et celui de traduction d'algorithmie pour des bases diverses même si j'oublie des choses ici.

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)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
nefurious



Autorisation : Membre
Nb de messages : 3
Inscrit le : Jeu 31 Oct 2013, 11:37
Posté le : Jeu 31 Oct 2013, 18:45   Citer 

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 happy.gif

 Adresse email Haut de page Bas de page 
 
Poster un nouveau sujet Poster une réponse





  Page générée en 6 requêtes