Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#51 01-05-2020 15:24:50
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Probabilité difficile (Bac 2019 Maroc)
Ave,
Je veux être certain que tu récupères bien le rang du troisième larron du triplet 123.
Penses-tu que je n'aie pas vérifié ?
Exemple avec
T=[[1,51],[2,28],[3,12]] # Des crochets !!! pas des parenthèses...
Après
T.sort(key=lambda X : X[1])
j'ai
T=[[3, 12], [2, 28], [1, 51]]
Après
k =T[2][1]
j'ai
k=51
Et maintenant, j'incrémente de 1 la valeur stockée à la position Result[51]
n=100 000
[0, 0, 0, 0, 2, 3, 10, 10, 17, 27, 24, 43, 46, 51, 55, 79, 80, 86, 88, 104, 122, 120, 178, 143, 174, 190, 214, 209, 237, 260, 260, 278, 306, 357, 331, 343, 369, 425, 429, 407, 442, 506, 546, 538, 596, 586, 628, 673, 687, 740, 728, 810, 803, 801, 921, 925, 941, 976, 1055, 1025, 1032, 1095, 1143, 1200, 1252, 1328, 1340, 1304, 1436, 1480, 1501, 1494, 1609, 1571, 1628, 1718, 1719, 1837, 1943, 1939, 1946, 1952, 2027, 2025, 2155, 2231, 2318, 2353, 2393, 2457, 2442, 2518, 2599, 2722, 2705, 2743, 2854, 2930, 3003, 3054]
Pour le tri, je t'expliquerai (c'est un peu plus subtil, mais il y a une solution alternative plus "transparente"), je ne l'ai pas fait pour mieux se concentrer sur le script lui-même...
@+
[EDIT]
Tu regardes un film ?
Si c'est un épisode d'une série, un documentaire (France 3, France 5, Arte...)
https://captvty.fr/faq#macos
Descends dans la page jusqu'à voir
\\AUTRES PROBLEMES ET QUESTIONS DIVERSES
Comment faire pour utiliser Captvty sous macOS ?
Tu peux le télécharger sur ta machine et cerise sur le gâteau, sans la pub !
Dernière modification par yoshi (01-05-2020 15:26:07)
Hors ligne
#52 01-05-2020 16:58:33
- freddy
- Membre chevronné

- Lieu : Paris
- Inscription : 27-03-2009
- Messages : 7 457
Re : Probabilité difficile (Bac 2019 Maroc)
Hello,
Ça a une belle tête mais on dirait qu’il faille aller encore plus loin pour trouver les rangs faibles, avec n encore plus grand.
Je vais essayer d’écrire un pgm en python comme je l’ai imaginé, le langage est très évolué et nécessite de connaître un tas de procédure que j’ignore encore. Je vais faire comme si j’avais SAS ou VBA.
Merci pour l’info, je vais voir !
Dernière modification par freddy (01-05-2020 16:59:23)
Hors ligne
#53 01-05-2020 17:59:29
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Probabilité difficile (Bac 2019 Maroc)
Re,
prog modifié pour l'extension scientifique numpy de Python
n= 50 000 000
[ 0 0 29 103 163 299 472 654 816 1157
1386 1718 1938 2415 2874 3284 3716 4194 4889 5216
5733 6397 7239 7839 8617 9446 10022 10844 11667 12751
13372 14516 15195 16210 17456 18478 19318 20635 21848 23032
24129 25129 26668 27965 29281 30612 32071 33352 34751 36261
37858 39428 40824 42312 44220 46152 47837 49172 51269 53065
54765 56720 58490 60436 62365 64584 66557 68325 70793 72304
74390 76783 79108 81059 83663 85922 87945 90489 92856 94887
97811 100055 102615 105399 107845 110109 112931 116006 118743 121072
124050 126244 129248 131541 134965 138247 141542 144466 146454 149922]
Qu'est-ce qui te plaît pas dans la conception du script ?
Il est pourtant - en principe - conforme à ton cahier des charges...
@+
Hors ligne
#54 01-05-2020 18:05:50
- freddy
- Membre chevronné

- Lieu : Paris
- Inscription : 27-03-2009
- Messages : 7 457
Re : Probabilité difficile (Bac 2019 Maroc)
Re,
tu as fait quoi ? Sinon, le pgm est parfait, tout est dit avec un extraordinaire économie de moyen, je ne ferai rien de plus, il faut seulement que je me mette à lire sérieusement la référence que tu avais donnée une fois, ce que je suis en train de faire en pdf.
PS : j'ai un message d'erreur sur ton code, il ne veut rien faire ...
Dernière modification par freddy (01-05-2020 18:51:00)
Hors ligne
#55 01-05-2020 19:37:17
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Probabilité difficile (Bac 2019 Maroc)
Normal, je viens de vérifier :
en mettant les balises code, j'ai fait sauter la parenthèse fermante du print ...
Mille excuses !
Ecrire :
print (RESULT)
Mais le message d'erreur
1. Il faut le donner
2. Lis-le et tu verras qu'il te disait où ça n'allait pas
Je reproduis l'erreur et j'ai :
Titre : Syntax Error
Message :
unexpected EOF while parsing...
EOF = End Of File, abréviation standard.
En gros, tu étais invité à mettre le nez sur la fin du fichier..
VARIANTE toujours en Pyhon pur:
from random import *
from operator import itemgetter
from time import time
U=[i for i in range(1,101)]
RESULT=[0 for i in range(100)]
n=10000
for brassage in range(n):
seed=time() # je change de table dans le générateur des nombres pseudo-aléatoires
shuffle(U)
a,b,c=U.index(1),U.index(2),U.index(3)
T=[[1,a],[2,b],[3,c]]
T.sort(key=itemgetter(1))
k=T[2][1]
RESULT[k]+=1
print (RESULT)
sort() c'est l'ordre de tri.
l'autre version était :
T.sort(key=lambda X:X[1])
lambda c'est une fonction appelée fonction anonyme (pas besoin de lui donner un nom, juste dire ce qu'elle doit faire)
Là, T.sort() veut dire : trie la liste T (par défaut, c'est ordre croissant)...
Mais T c'est une liste de listes (un tableau à deux dimensions, si tu préfères)
donc je dois lui dire : pour le tri, la clé (key) c'est ce que donne la fonction lambda qui va prendre le 2e élément (donc position 1) de chaque sous-liste X, soit X[1] et ranger par ordre croissant de 2e élément, les sous listes X
Ce qui donne : T.sort(key=lambda X : X[1])
Dans la 2e version
j'ai importé la fonction itemgetter (attrapeur d'items) du module operateur.
Puis je m'en sers comme ça :
T.sort(key=itemgetter(1))
Je luis dit : trie moi la liste T composée de sous listes sur le 2e élément : avec la clé itemgetter(1)
Version numpy :
import numpy as np
from operator import itemgetter
U=np.arange(1,101)
Result=np.zeros(100,dtype=np.uint32)
n=50000000
for essai in range(n):
np.random.shuffle(U)
a,b,c=np.where(U==1)[0][0],np.where(U==2)[0][0],np.where(U==3)[0][0]
T=[[1,int(a)],[2,int(b)],[3,int(c)]]
T.sort(key=itemgetter(1))
k=T[2][1]
Result[k]+=1
print (Result)
numpy travaille indifféremment sur des listes ou de vrais tableaux et il est nettement plus rapide de travailler sur des tableaux que sur des listes.
U et Result sont des tableaux
Je n'ai pas encore trouvé de solution de tri sélectif de tableaux avec numpy que je comprenne vraiment.
Alors j'ai gardé la liste T : une liste 3 sous-listes de 2 éléments, ça ne va pas chercher très loin en matière de perte de temps...
Le dernier résultat fourni était pour n= n= 5 000 000 et non 50 000 000
Je teste en ce moment 50 000 000
@+
[EDIT] Et voilà, cadeau Bonux
Avec version numpy
n=50 000 000
20-25 min de calculs
Résultat :
[ 0 0 308 952 1938 3127 4614 6437 8559
11113 13895 17054 20247 24171 28022 32201 36955 42120
47390 53169 58801 64933 71898 77670 85481 92920 100236
108150 116545 125938 134485 143877 153000 162709 173408 184293
195072 206465 217413 228191 241312 252950 266251 279585 291884
306160 320155 334280 348927 363336 378130 394297 411475 424861
442107 458561 475815 494298 511459 528953 546420 565850 583400
604223 622933 643790 664827 684360 703677 725496 746547 767010
790931 813769 836155 856769 882302 905531 930015 953038 976718
1001494 1027459 1050945 1079555 1103644 1131116 1155243 1182389 1211888
1238598 1266636 1294810 1322524 1352480 1380175 1411046 1439609 1468884
1499191]
Dernière modification par yoshi (01-05-2020 20:21:36)
Hors ligne
#56 01-05-2020 21:11:29
- freddy
- Membre chevronné

- Lieu : Paris
- Inscription : 27-03-2009
- Messages : 7 457
Re : Probabilité difficile (Bac 2019 Maroc)
Re,
j'ai un pb d'indentation, je ne comprends pas où ! ...
SyntaxError: unexpected indentje peux te dire que rien ne m'énerve plus que de ne pas comprendre pourquoi ça ne marche pas !
et maintenant j'ai ça avec le premier pgm : yntaxError: multiple statements found while compiling a single statement
ça me tape sur les nerfs de ne pas comprendre, je me sens comme un canard devant un chausse pied !
Ca me fait iech, j'abandonne, de toute façon, je ne sais pas ce qu'il faut faire, m.rde ...
Tu me dis pourquoi ça plante ! ... ça m’agace à un point ! J’ai tout vérifié et ...
Hors ligne
#57 01-05-2020 21:30:25
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Probabilité difficile (Bac 2019 Maroc)
Tu lances l'iDLE de Python.
Tu ouvres le Menu File
Choisis New File
Une fenêtre vide s'ouvre.
Et tu peux faire un copier/coller dans cette fenêtre vide
C'est bien ce que tu as fait ?
Si tu as fait un copier/coller :
vérifie l'indentation du 1er from
la balise code telle que je l'utilise décale la 1ere ligne de 1 caractère à droite...
Sinon, je viens de casser une indentation volontairement chez moi.
Au lancement du prog, j'ai le message.
Si je décale faussement une ligne vers la gauche, un rectangle m'indique l'erreur sur la ligne en dessous (et c'est logique).
Si je décale faussement une ligne vers la droite, un rectangle m'indique l'erreur sur la ligne fautive.
Regarde tes lignes de code, quand le message d'erreur s'affiche, et cherche le rectangle rouge qui apparaît.
L'indentation doit être impérativement la même que dans le code que je te remets sans couleur (et sans commencer par sauter une ligne)
l'IDLE de Python rétablit l'indentation automatiquement, si on lui demande...
Tes 7 premières lignes de code doivent toutes être calées à gauche (indentation : 0)
Place alors le curseur après les : de la ligne for...
Appuie sur suppr (ou Del selon les claviers) : la ligne seed=time() remonte sur la même ligne
Appuie sur Entrée
Place le curseur après la parenthèse fermante de time()
Appuie sur suppr : la ligne shuffle(U) remonte sur la même ligne
Appuie sur Entrée
Place le curseur après la parenthèse fermante de shuflle(U)
Appuie sur suppr : la ligne a,b,c remonte sur la même ligne
Appuie sur Entrée
...
and so on jusqu'à la ligne k=T[2][1]
.......
Place le curseur après le crochet fermant du 1
Appuie sur suppr : la ligne RESULT[k]+=1 remonte sur la même ligne
Appuie sur Entrée
Le print(RESULT) doit, lui, être aussi calé à gauche.
from operator import itemgetter
from time import time
U=[i for i in range(1,101)]
RESULT=[0 for i in range(100)]
n=10000
for brassage in range(n):
seed=time()
shuffle(U)
a,b,c=U.index(1),U.index(2),U.index(3)
T=[[1,a],[2,b],[3,c]]
T.sort(key=itemgetter(1))
k=T[2][1]
RESULT[k]+=1
print (RESULT)
Compare ligne à ligne l'indentation ci-dessus et celle que tu as chez toi, tu devrais trouver assez vite...
Sinon, je viens de vérifier, reprends une New File et fais un copier/coller, c'est correct cette fois.
N-B
sur un clavier PC, suppr en français et delete en anglais, sert à supprimer le caractère sous le curseur, ou après le curseur si ce dernier est entre deux caractères. Tu dois avoir ça sur un clavier Mac...
@+
Hors ligne
#58 01-05-2020 21:44:24
- freddy
- Membre chevronné

- Lieu : Paris
- Inscription : 27-03-2009
- Messages : 7 457
Re : Probabilité difficile (Bac 2019 Maroc)
Ok je regarde, merci
Sur un clavier Mac on n’a pas suppr faut Faure autrement mais je sais faire.
Je ne savais pas qu'il fallait ouvrir une feuille neuve, puis ... bon, là ça marche, merci mais c'est un peu agaçant de marcher à tâtons dans le noir :-)
Dernière modification par freddy (01-05-2020 21:57:27)
Hors ligne
#59 02-05-2020 08:34:19
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Probabilité difficile (Bac 2019 Maroc)
Salut freddy,
Tu devrais pourtant savoir que la programmation est une école de patience...
Bon vois-tu, cette histoire de tri me tracassait : c'était une pierre dans mon jardin..
Alors, j'ai décidé de foutre la paix à mon cerveau et de le laisser se débrouiller tout seul !
Ce matin, je reprends et 5 min après, tapant du poing droit dans ma main gauche, tel le commissaire Bourrel de ma jeunesse, je me suis exclamé :
<< Bon sang ! Mais c'est bien sûr !... >>
En fait on se fiche pas mal de savoir qui de 1, 2 ou 3 est le dernier sorti : tout ce qui nous intéresse, c'est la position du dernier sorti... Il me suffit de connaître le maximum des 3 positions.
Donc voilà le code simplifié :
from time import time
U=[i for i in range(1,101)]
RESULT=[0 for i in range(100)]
n=1000000
for brassage in range(n):
seed=time()
shuffle(U)
k=max(U.index(1),U.index(2),U.index(3))
RESULT[k]+=1
print (RESULT)
Résultat pour n=1 000 000
[0, 0, 6, 18, 47, 67, 84, 128, 169, 246, 266, 364, 403, 503, 568, 661, 740, 886, 943, 1059, 1202, 1356, 1453, 1614, 1648, 1836, 2005, 2253, 2276, 2516, 2681, 2870, 3057, 3243, 3459, 3677, 3916, 4171, 4239, 4588, 4828, 5023, 5101, 5599, 5851, 6072, 6471, 6579, 7096, 7213, 7682, 7980, 7981, 8348, 8817, 9077, 9407, 9940, 10467, 10597, 11020, 11325, 11824, 11869, 12515, 12741, 13356, 13777, 13908, 14375, 14941, 15395, 15719, 16356, 16707, 17267, 17430, 17976, 18509, 19034, 19484, 20202, 20313, 21250, 21641, 22120, 22638, 23140, 23912, 24349, 24922, 25233, 26101, 26329, 27047, 27528, 27960, 28929, 29393, 30118]
Bien régulier...
@+
Hors ligne
#60 02-05-2020 09:22:19
- freddy
- Membre chevronné

- Lieu : Paris
- Inscription : 27-03-2009
- Messages : 7 457
Re : Probabilité difficile (Bac 2019 Maroc)
Salut,
oui, là, c'est beaucoup mieux ! :-)
Bon, j'écris l'idée que j'avais, mais il plante sur un test genre "if U[k]==1:" et il me dit que c'est out of range ???
Bon, j'ai compris, il faut que j'oublie tout mes réflexes développés avec d'autres langages :-) et que j'apprenne ce nouveau langage qui me contrarie fort, car il ne fait pas ce que je veux ;-) L'éternelle lutte de l'homme et de la machine !
Dernière modification par freddy (02-05-2020 09:32:00)
Hors ligne
#61 02-05-2020 09:41:36
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Probabilité difficile (Bac 2019 Maroc)
Re,
Quel est le nombre d'éléments de U ?
Ton k est supérieur à ce nombre, d'où le message.
Pour le reproduire, c'est facile
Je prends U=[1,3,4,2]
Réflexe à oublier : je veux savoir si le 4e élément vaut 2...
Emporté par mon élan, je tape :
if U[4]==2:
print("Oui !")
else:
print("Non !")
Et paf : IndexError: list index out of range ???
le 4e élément ce n'est pas U[4], mais U[3]...
La numérotation commence à 0 !!!
@+
Hors ligne
#62 02-05-2020 10:10:43
- elmaths
- Membre
- Inscription : 03-12-2019
- Messages : 25
Re : Probabilité difficile (Bac 2019 Maroc)
elmaths a écrit :Pour choisir un nombre de $\{1, 2,3\}$ dans le tirage $k$, on a $C_3^1=3$ possibilités.
Pour ordonné les deux boules restant sur $k-1$ place, on a $A_{k-1}^2$ possibilités.
Après on choisit $k-3$ boules, pour ordonné sur $k-1$ place alors on a : $C^{k-3}_{n-3} (k-3)!$ possibilités.
Les boules restantes $(n-k)$ alors on a $(n-k)!$ possibilitésFinalement $$P(X_n=k)=\dfrac{C_3^1A_{k-1}^2C^{k-3}_{n-3} (k-3)!(n-k)!}{n!}=\dfrac{3(k-1)(k-2)}{n(n-1)(n-2)}$$
Salut,
OK, mais maintenant, il faut que tu prouves que $$\sum_{k=3}^n P(X_n=k)=1$$ par tout moyen à ta convenance :-)
Bonjour freddy;
Pour tout $k$ de $\mathbb{N}$, on a : $(k-1)(k-2)=(k-1)^2-(k-1)$, alors :
$P(X_n=k)=\dfrac{3(k-1)(k-2)}{n(n-1)(n-2)}=3\dfrac{(k-1)^2-(k-1)}{n(n-1)(n-2)}$
alors :
$\sum\limits_{k = 3}^n {P\left( {{X_n} = k} \right) = } \dfrac{3}{{n\left( {n - 1} \right)\left( {n - 2} \right)}}\sum\limits_{k = 3}^n {{{\left( {k - 1} \right)}^2} - \left( {k - 1} \right)} $
$\sum\limits_{k = 3}^n {P\left( {{X_n} = k} \right) = } \dfrac{3}{{n\left( {n - 1} \right)\left( {n - 2} \right)}}\left( {\left( {{2^2} + {3^2} + .... + {{\left( {n - 1} \right)}^2}} \right) - \left( {2 + 3 + 4 + ....+ \left( {n - 1} \right)} \right)} \right)$
$\sum\limits_{k = 3}^n {P\left( {{X_n} = k} \right) = } \dfrac{3}{{n\left( {n - 1} \right)\left( {n - 2} \right)}}\left( {\left( {{1^2} + {2^2} + {3^2} + .... + {{\left( {n - 1} \right)}^2}} \right) - \left( {1 + 2 + 3 + 4 + .... + \left( {n - 1} \right)} \right)} \right)$
Pour tout $n$ de $\mathbb{N}$, on a : $\sum\limits_{k = 1}^n {k = \dfrac{{n\left( {n + 1} \right)}}{2}}$ et $\sum\limits_{k = 1}^n {{k^2} = \dfrac{{n\left( {n + 1} \right)\left( {2n + 1} \right)}}{2}}$
alors :
$\sum\limits_{k = 3}^n {P\left( {{X_n} = k} \right) = } \dfrac{3}{{n\left( {n - 1} \right)\left( {n - 2} \right)}}\left( {\dfrac{{\left( {n - 1} \right)n\left( {2\left( {n - 1} \right) + 1} \right)}}{6} - \frac{{\left( {n - 1} \right)n}}{2}} \right)$
$
\sum\limits_{k = 3}^n {P\left( {{X_n} = k} \right) = } \dfrac{3}{{n\left( {n - 1} \right)\left( {n - 2} \right)}}\left( {\dfrac{{n\left( {n - 1} \right)\left( {2n - 1} \right)}}{6} - \dfrac{{3n\left( {n - 1} \right)}}{6}} \right)$
$\sum\limits_{k = 3}^n {P\left( {{X_n} = k} \right) = } \dfrac{3}{{n\left( {n - 1} \right)\left( {n - 2} \right)}}\left( {\dfrac{{n\left( {n - 1} \right)\left( {2n - 1 - 3} \right)}}{6}} \right)$
$\sum\limits_{k = 3}^n {P\left( {{X_n} = k} \right) = } \dfrac{3}{{n\left( {n - 1} \right)\left( {n - 2} \right)}}\left( {\dfrac{{n\left( {n - 1} \right)\left( {2n - 4} \right)}}{6}} \right)$
$\sum\limits_{k = 3}^n {P\left( {{X_n} = k} \right) = } \dfrac{3}{{n\left( {n - 1} \right)\left( {n - 2} \right)}}\left( {\dfrac{{2n\left( {n - 1} \right)\left( {n - 2} \right)}}{6}} \right)$
$\sum\limits_{k = 3}^n {P\left( {{X_n} = k} \right) = } \dfrac{{6n\left( {n - 1} \right)\left( {n - 2} \right)}}{{6n\left( {n - 1} \right)\left( {n - 2} \right)}}$
$\sum\limits_{k = 3}^n {P\left( {{X_n} = k} \right) = } 1
$
Hors ligne
#63 02-05-2020 10:21:14
- freddy
- Membre chevronné

- Lieu : Paris
- Inscription : 27-03-2009
- Messages : 7 457
Re : Probabilité difficile (Bac 2019 Maroc)
Salut,
c'est très bien, mais tu avais un argument immédiat, de pure logique et sans calcul, vois-tu lequel ? C'est une manière de bien comprendre ce qu'est une variable aléatoire.
Dernière modification par freddy (02-05-2020 10:25:36)
Hors ligne
#64 02-05-2020 10:24:28
- freddy
- Membre chevronné

- Lieu : Paris
- Inscription : 27-03-2009
- Messages : 7 457
Re : Probabilité difficile (Bac 2019 Maroc)
Salut yoshi,
voilà comment j'aurais fait :
from random import *
from time import time
U=[i for i in range(1,21)]
RESULT=[0 for i in range(1,21)]
n=100000
for brassage in range(n):
cpt=0
seed=time()
shuffle(U)
for k in range(20):
if U[k]==1 or U[k]==2 or U[k]==3:
cpt+=1
if cpt==3:
break
RESULT[k]+=1
print (RESULT)
[0, 0, 100, 269, 510, 878, 1337, 1841, 2460, 3074, 3900, 4874, 5782, 6747, 8009, 9317, 10425, 11873, 13386, 15218]
PS : je ne comprends pas pourquoi je n'ai pas de couleurs et les caractères sont si gros ...
Dernière modification par freddy (02-05-2020 10:58:39)
Hors ligne
#65 02-05-2020 10:57:02
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Probabilité difficile (Bac 2019 Maroc)
Couleurs :
après code ajouter = Python
Gros caractères :
passent en gras dès le saut de ligne. C'est la balise code qui est foireuse.
Je vais demander à Fred d'y jeter un œil...
Sinon, bravo...
Hors ligne
#66 02-05-2020 12:52:17
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Probabilité difficile (Bac 2019 Maroc)
Re,
if U[k]==1 or U[k]==2 or U[k]==3:
cpt+=1
if cpt==3:
break
Solutions alternatives
if U[k] in [1,2,3]:
cpt+=1
if cpt==3:
break
if X in [1,2,3]:
cpt+=1
if cpt==3:
break
La même, en plus court :
cpt+=(X in [1,2,3]):
if cpt==3:
break
@+
Hors ligne
#67 03-05-2020 10:55:58
- freddy
- Membre chevronné

- Lieu : Paris
- Inscription : 27-03-2009
- Messages : 7 457
Re : Probabilité difficile (Bac 2019 Maroc)
Salut yoshi,
j'aime bien la première variante !
Si j'avais dû simuler la première question, ci-dessous la méthode que j'aurais utilisée. Finalement, l'éditeur de Python est bavard mais assez clair sur les erreurs de code qu'on peut faire, c'est assez confortable :-)
from random import *
from time import time
U=[i for i in range(1,21)]
cpt=0
n=100000
for brassage in range(n):
seed=time()
shuffle(U)
for k in range(18):
if U[k]==1 and U[k+1]==2 and U[k+2]==3:
cpt+=1
break
print (cpt)
On a 270, 265, 277, 251, 264, 254,250, 247 ...
Ce qui est intéressant et que ça illustre les problèmes d'échantillonnage et de la recherche des vraies valeurs des paramètres d'une loi de probabilités.
On a un tirage aléatoire, le calcul donne une proba et pourtant, les résultats fluctuent autour de 263 pour 100.000. Et donc, une des questions qu'on se pose est de savoir si ces fluctuations sont normales ou bien si elles cachent une valeur autre que celle qu'on pense retient. Donc combien de résultatls faut il avoir, quelle marge d'erreur accepte t-on, ... ?
Je regarde pour le code que j'aurais fait pour la Q2.
PS : bon, voilà ce que j'aurais fait.
from random import *
from time import time
U=[i for i in range(1,21)]
cpt=0
n=100
for brassage in range(n):
seed=time()
shuffle(U)
flag=0
for k in range(20):
if flag==0:
if U[k]==1:
flag=1
elif flag==1:
if U[k]==2:
flag=2
elif flag==2:
if U[k]==3:
cpt+=1
break
print (cpt)
je note que le langage ne pardonne aucun erreur de programmation, il est très exigeant sur la logique à développer, difficile de faire comme on pense pouvoir le faire instinctivement.
Je suis à peu près certain que yoshi va trouver plus court, je suis preneur !
Dernière modification par freddy (03-05-2020 12:28:57)
Hors ligne
#68 03-05-2020 13:42:05
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Probabilité difficile (Bac 2019 Maroc)
Salut freddy,
seed=time()
shuffle(U)
for k in range(18):
if U[k]==1 and U[k+1]==2 and U[k+2]==3:
cpt+=1
break
print (cpt)
C'est déjà un beau code, assez gratifiant...
Il n'est par contre pas optimisé : Python est un langage interprété donc plus lent qu'un langage qui est compile un programme dès que tu l'essaies.
Donc, l'inconvénient (l'avantage ?) c'est que dès que tu as une mouture qui tourne, il faut partir à la "chasse au gaspi"...
Pour te permettre d'avancer, quelques commentaires.
Là, si tu procèdes à 100 000 brassages, tu auras procédé à 3 *(k+2) * 100 000 tests...
Alors, tu peux objecter que de toutes façons, les 3 tests, il faut les faire.
Certes, mais tu imposes de l'extérieur 3 accès à U : U[k], U[k+1], U[k+2], puis 3 comparaisons...
De l'extérieur, parce que si tu confies le boulot à une fonction intégrée (built in) tu gagneras du temps.
De plus ta boucle supplémentaire sur k va être reproduite 100000 fois...
Donc ton temps va varier d'un facteur 1 à 18...
Voilà la version ma version aboutie.
from random import *
from time import time
U=[i for i in range(1,101)]
compteur =0
n=1000000
for essai in range(n):
seed=time()
shuffle(U)
a,b,c=U.index(1),U.index(2),U.index(3)
if c==b+1==a+2:
compteur+=1
print (compteur)
Différences
1. Je n'ai pas de 2e boucle...
2. je ne vais pas tester une par une les positions de U pour trouver où est le 1. Je vais demander à Python de chercher tout seul que est l'index du 1 dans U, l'index du 2 dans U, l'index du 3 dans U et de les ranger dans un triplet a,b,c qui est une structure ordonnée...
Sachant cela je n'ai plus qu'à demander à Python si c=b=1=a+2 je gagne encore du temps...
De plus pour la question 2, j'ai toujours besoin d'un triplet ordonné donc je peux reprendre le code jusque là...
La Q2 spéciifie : dans cet ordre mais ajoute consécutivement ou non.
Puisque a,b,c ne peuvent égaux, mon test devient :
if a<b<c:
D'où le code :
from time import time
U=[i for i in range(1,101)]
compteur =0
n=1000000
for essai in range(n):
seed=time()
shuffle(U)
a,b,c=U.index(1),U.index(2),U.index(3)
if a<b<c
compteur+=1
print (compteur)
Si tu veux pouvoir comparer les temps d'exécution hors préparation, tu rajoutes deux lignes :
from time import time
U=[i for i in range(1,101)]
compteur =0
n=10000
debut=time()
for essai in range(n):
seed=time()
shuffle(U)
a,b,c=U.index(1),U.index(2),U.index(3)
if a<b<c:
compteur+=1
print ("Temps d'exécution", time()-debut,"s")
print (compteur)
tests chez moi pour 10000 de brassages et 100 nombres :
ton code : 1.3440768718719482 s
le mien : 1.2200698852539062 s
Pour 100000 de brassages :
ton code : 13.585777044296265 s
le mien : 11.448654890060425 s
Pour 1 000 000 de brassages
ton code : 135.70876216888428 s
le mien : 114.80956673622131 s
@+
Hors ligne







