from random import shuffle
from math import sqrt

n = 2 # nombre de pièces défectueuses
N = 6 # nombre total de pièces

def XY(n,N):
  listepieces = [False]*n + [True]*(N-n) # True = conforme, False = défectueux
  shuffle(listepieces) # on mélange la liste des pièces
  X,Y = 0,0 # on initialise X et Y à des valeurs impossibles
  for k in range(N):
    if not listepieces[k]: # si la pièce numéro k n'est pas conforme
      if X != 0: #si c'est la première pièce non conforme rencontrée
        Y = k + 1 # on ajoute 1 pour avoir un résultat entre 1 et N
        break # on quitte la boucle
      else:
        X = k + 1
  return (X,Y)
  
# le code ci-dessous répète l'expérience un grand nombre de fois pour obtenir des approximations des espérances de X, Y, X², Y² et XY, et en déduire les variances, covariance, etc.
  
EX = 0
EX2 = 0
EY = 0
EY2 = 0
EXY = 0

k = 10000 # nombre de répétitions

for i in range(k): # on fait tourner l'expérience k fois en additionnant les valeurs
  (X,Y) = XY(n,N)
  EX = EX + X
  EX2 = EX2 + X**2
  EY = EY + Y
  EY2 = EY2 + Y**2
  EXY = EXY + X*Y
  
# on divise les résultats par k pour obtenir les moyennes, on effectue les calculs de variance et covariance
  
EX = EX/k
EX2 = EX2/k
EY = EY/k
EY2 = EY2/k
EXY = EXY/k
VX = EX2-EX**2
VY = EY2-EY**2
CXY = EXY-EX*EY

#affichage des résultats

print(n, "pièces défectueuses parmi", N, ";", k, "tirages :")
print("E(X) =",EX)
print("E(Y) =",EY)
print("E(X2) =",EX2)
print("E(Y2) =",EY2)
print("V(X) =",VX)
print("V(Y) =",VY)
print("Cov(X,Y) =",CXY)
print("ρ(X,Y) =",CXY/sqrt(VX*VY))
