Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#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)

freddy a écrit :

Re,

j'ai un pb d'indentation, je ne comprends pas où ! ...
SyntaxError: unexpected indent

je 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 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()
    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 random import *
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)

freddy a écrit :
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és

Finalement $$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,

    for k in range(18):
        if U[k]==1 or U[k]==2 or U[k]==3:
            cpt+=1
        if cpt==3:
            break

Solutions alternatives

    for k in range(20):
        if U[k] in [1,2,3]:
            cpt+=1
        if cpt==3:
            break
    for k, X in enumerate(U):
        if X in [1,2,3]:
            cpt+=1
        if cpt==3:
            break

La même, en plus court :

    for k, X in enumerate(U):
        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,

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)
 

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 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 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 random import *
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

Pied de page des forums