Voici mon problème :
On note l'évènement N:"Deux élèves dans une classe de 30 élèves ont le même jour d'anniversaire"
Nous pouvons voir que cela peut être modélisé par un tirage de 30 boules dans une urne qui en contient 365 numérotées ( équiprobabilité pour chaque boule )
1. Calculer P(N)
( Aide : On commercera par chercher Nbarre puis P(Nbarre)
Le calcul de P(Nbarre) étant un peu long on pourra faire un programme pour le calculer.
Donc voila ce que je peux dire :
Nbarre:"Tous les élèves ont une date d'anniversaire différente"
P(Nbarre)= (365*364*363*362*361*...*336)/365^30
P(N) = 1 - P(Nbarre)
Je ne comprend pas comment réaliser un programme qui puisse calculer ceci rapidement et facilement !
Alors heu je me suis penché dessus 5minutes et j'ai trouvé un moyen de le faire. Après c'est possible qu'il y est d'autre possibilité..
SAUF que.. Je peux réaliser ton probleme en C et en PHP mais le basic.. Pas mon truc.
Je peux juste te donner "l'idée" : faut faire une boucle.
Par exemple : tu mets une variable i = 365, tant que i > 335 on fait :
i = i * (i - 1)
(et on DEcrémente i de 1 a chaque tour de boucle)
Donc au départ tu as i = 365
La variable i va donner apres un tour de boucle : 365 * (365 - 1) soit 365*364
Au deuxieme de tour elle vaudra 365*364 * (364-1)DONC 365*364*363.
Donc a la fin elle vaudra 365*364*363*362.. etc jusqu'a 336.
(Tu peux ecrire les calculs sur une feuille de papier, tu verras que ça se vérifie)
Apres la boucle de ton programme, tu fais : i/365^30 tout simplement. Et t'obtient la proba de P(Nbarre).
Et tu calcules ton P(N).
J'espere que ce que je t'ai dis est faisable en Basic.. Car je connais pas du tout mais je me doute qu'il y est du boucle, des calculs, des affichages.. Donc j'espere que ça fonctionnera ^^'.
Bonne continuation
Merci je pense que c'est une bonne idée ca doit être faisable
Notre prof de math nous a demandé de faire un programme sur cela mais nous avons très peu travailler les programmes sur la calculatrice !
Sinon j'ai fais le calcul à la bourrin et j'ai trouvé pour P(N) 71% environ ^^
J'ai dis une petite bêtise dans le code par contre.
Faut utiliser une autre variable que i pour la boucle.
Si tu utilises i pour garder le résultat c'est pas bon en faite ^^'.
Parce que dans la boucle on écrit que i va être egal a 365*364 etc... Donc i sera toujours supérieure a 335. (Si tu vois ce que je veux dire).
Faut plutot faire comme ça :
i = 365, tant que i > 365, on décremente i de 1 a chaque tour de boucle
Et on ecrit :
resultat = i * (i - 1);
resultat étant une variable toute simple ^^' qui contiendra cette fois le bon résultat (donc 365*364 etc...)
J'essaye de faire un programme de mon coté en C pour voir si je trouve environ 71%, si ça peut aider ;)
J'espere que tu vois ce que je veux dire sur mon erreur plus haut.
Bonne continuation
Oui j'ai essayé de faire un programme avec l'aide de ton 1er post mais apparemment ca bug ! je te montre : ( c'est pas compliqué a comprendre )
:Prompt e ( la ca demande la valeur de e , c'ets le nombre d'élèves en fait )
:365->i ( donc la c'est i=365 )
:While i>365
:i*(i-1)->i
:EndWhile ( donc la c'est la boucle comme tu ma dit )
:1-(i/365^e)->p ( ici on calcule la proba de P(N)
:Disp approx(p) ( et donc ici on affiche a l'écran la veur approximative de P(N))
:EndPrgm
euh non je me suis trompé a la ligne While en fait dans mon programme j'ai écrit ca :
:While i>(365-e)
je pense que l'erreur est là, pour le bug, parce que par exemple si on a 30 élèves on aura i>335 mais i est toujours supérieur a 335 :s
Ah j'allais reposter un message en disant que c'était très compliqué en approfondissant bien..
Mais je crois avoir trouvé, j'ai trouvé P(N) = 0.730455
Donc P(N) = 73% environ.
J'ai fait comme ça :
i = 365, resultat = 365 (c'est important :p ).
Donc la boucle comme on avait dit : Tant que i > 335 (car on veut jusqu'a 336) on fait a chaque tour de boucle :
resultat = resultat * (i - 1);
Donc cette fois je suis bien sur ^^'.
1er Tour de boucle : resultat = resultat(donc 365) * 364
Deuxieme tour : resultat = resultat (donc l'ancien resultat de la 1ere boucle donc : 365 * 364) * 363..
Et là ça fait ainsi de suite.
Ensuite on fait puissance = 365 ^ e (nombre d'eleve donc 30 ^^').
(En C il faut une librairie a inclure en plus pour ça, je sais pas si c'est le cas pour le Basic ^^').
Et puis la division de resultat/puissance donc par exemple :
PNbarre = resultat/puissance;
Et PN = 1 - PNbarre;
Tu affiches PN, et normalement c'est bon ^^'
J'espere que t'as compris mon raisonnement ![]()
(Et que ça va fonctionner !)
Bon, j'en suis là et ca ne marche pas :s :
:Prompt e
:365->i
:365->r
:While r>365-e
:r*(i-1)->r
:i-1->i
:EndWhile
:1-(r/365^e)->p
:Disp approx(p)
:EndPrgm
La partie importante est là :
:While r>365-e ( la boucle continue tant que r>365-e)
:r*(i-1)->r ( r prend la valeur de r*(i-1) )
:i-1->i ( i prend la valeur de i-1 )
:EndWhile
Quand je teste le programme en mettant e=30 il me met comme resultat -97.384 ![]()
Heu pour la boucle faut dire :
While i>335
Comme ça ça donnera : La boucle continue tant que i strictement supérieur a 335!
Ensuite le reste c'est bon je pense ![]()
r*(i - 1)->r (Là c'est bon)
et i-1->i
Vala ^^
Euh oui j'ai bien mis i et non r, c'est juste une faute de frappe a l'ordi ![]()
Bon j'ai essayé autre chose mais ca ne marche pas non plus j'ai le même résultat :
:While i>365-e
:i-1->i
:r*i->r
:EndWhile
Dans la boucle tout a l'air correct..
Ca vient peut-être de la puissance (en tout cas je vois que ça là)
T'es sur qu'on peut faire une puissance simplement comme ça avec le signe ' ^ ' ?
Si c'est sur, essaye d'enregistrer 365^e dans une variable (par exemple : a)
Et tu fais 1-(r/a)->p
Et t'affiches p.
Ca rendra le code un peu plus lisible puis peut-être que ça corrigera quelque chose (des fois ça plante pour on ne sait quoi alors..)
Puis vérifie si on peut faire une puissance directement en Basic :p. Mais je te fais confiance je pense que c'est faisable non ? ^^
Oui je viens de verifier en faisant un petit prog vite fait
:Prompt p
:p^2->p
:Disp p
quand je rentre un nombre j'ai la bonne valeur a la sorti donc ca marche ^^
Bin heu je vois pas trop là..
Ca te dérangerait de me dire avec quoi tu codes en basic ? Je vais essayé d'apprendre les bases rapidement et de faire des tests pour t'aider au mieux ^^'.
Donc dis moi si tu veux. (Essaye de regarder le code un peu aussi, au cas ou y'a quelque chose qui te vient).
Parce que si je fais ça sous langage C et toi en BASIC, c'est pas vraiment la même chose.
(Juste je risque de partir manger et de m'absenter un petit moment, mais dés que je peux, je te donne une réponse si je trouve quelque chose !)
En fait, je code direct sur ma calculette avec le "Editeur prgm" ^^
Re-bonsoir.
Ah oui difficile de t'aider là :s Surtout que perso j'ai une TI-82 et j'ai essayé de fouiller un peu et je suis pas habitué alors je peux pas trop programmer dessus :s.
Faudrait que quelqu'un puisse nous éclaircir car au niveau de la logique, je pense que c'est bon, il doit y avoir quelque chose d'autre.
Essaye de mettre des parenthèses dans certains calculs.
Par exemple while i>(365-e)
Ou 1-(r/(365^e))
Peut-être ça peut venir de là.. Après je sais pas vraiment :s. J'essaye de t'aider au mieux ^^
HAAANNN
j'ai trouvé
Il faut mettre au début de la boucle :
While i>366-e
Ah c'était en faite une erreur d'un décalage.. ^^'
Je me suis dis au début du code en plus que souvent je fais des erreurs lors des boucles avec un petit décalage.
Mais en C ça m'avait sorti aucune erreur !
Bon bin, bien joué alors !
Le résultat que t'as obtenu c'est le meme que le mien ? :o
Bonne soirée
A la calculette je trouve :
0.70631624...
Et quand j'ai fais la méthode bourrin, j'avais trouvé pareil ^^
En effet, je trouve la même chose en C quand je corrige le problème du "décalage" avec la boucle !
Bin, bonne continuation alors ![]()