# -*- coding: utf-8 -*-
"""
Created on Tue Mar 31 06:38:18 2026

@author: pjaub
"""

import random as rd
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import chi2

plt.close('all')

N = 1000

def gauss():
    return rd.gauss(0, 1)

def simul_Z():
    s = 0
    for _ in range(5):
        y = gauss()
        s += y**2
    return s

plt.figure('Question 1')
x = np.linspace(0, 20, 200)
F_theo = chi2(df=5).cdf
plt.plot(x, F_theo(x), label="Théorique")

N_simul = 10000
x = [ simul_Z() for k in range(N_simul)] 
x.sort()
y = [ (k+1)/N_simul for k in range(N_simul)]
plt.plot(x, y, label="Empirique")

plt.legend()
plt.title("Comparaison des fonctions de répartition")
plt.show()

plt.figure('Question 2')
x = np.linspace(0, 20, 200)
F_theo = chi2(df=5).cdf
plt.plot(x, F_theo(x), label="Khi²(5)")

def calcul_C_obs(effectifs):
    C = 0
    for xi in effectifs:
        C += (xi - N/6)**2 / (N/6)
    return C

def simul_C():
    effectifs = [0]*6
    for i in range(N):
        face = rd.randint(1, 6)
        effectifs[face-1] += 1
    return calcul_C_obs(effectifs)

N_simul = 10000
x = [ simul_C() for k in range(N_simul)] 
x.sort()
y = [ (k+1)/N_simul for k in range(N_simul)]
plt.plot(x, y, label="C empirique")

plt.legend()
plt.title("Comparaison C vs Khi²")
plt.show()

effectifs1 = [160, 180, 163, 150, 166, 181]
c_obs1 = calcul_C_obs(effectifs1)

N_simul = 10000
s = 0
for k in range(N_simul):
    if simul_C() >= c_obs1:
        s += 1
print(s/N_simul)

effectifs2 = [195, 145, 158, 179, 149, 174]
c_obs2 = calcul_C_obs(effectifs2)

N_simul = 10000
s = 0
for k in range(N_simul):
    if simul_C() >= c_obs2:
        s += 1
print(s/N_simul)




