import matplotlib.pyplot as plt
import numpy as np
import numpy.random as rd

N = ...

B = ...     #grandeur expérimentale notée B
t_B = ...   #TOLERANCE sur la grandeur expérimentale B

C = ...     #grandeur expérimentale notée C
u_C = ...   #INCERTITUDE sur la grandeur expérimentale C

#Tirage aléaoire selon une distribution UNIFORME, cas où la tolérance est connue
B_sim = rd.uniform(B + t_B, B - t_B, N)
#Tirage aléaoire selon une distribution NORMALE, cas où l'incertitude est connue
C_sim = rd.normal(C, u_C, N)

#exemple où on cherche à calculer une grandeur A à partir de B et C et où A = B / C
#Vous pouvez mettre le calcul que vous voulez
A_sim = B_sim / C_sim

u_A = np.std(A_sim, ddof = 1)   #Calcul de l'incertitude à partir des N calculs
A = np.mean(A_sim)              #Calcul de la moyenne à partir des N calculs

#Affichage des résultats, moyenne en premier puis incertitude
print('A = ' + str(A) + ' unite')
print('u(A) = ' + str(u_A) + ' unite')

#Les lignes suivantes permettent de visualiser les valeurs calculées.
#pour que l'incertitude est du sens, il faut avoir une distribution gaussienne
plt.rcParams["figure.figsize"] = (5,3)
fig, ax = plt.subplots()
plt.hist(A_sim, bins='rice')   #bins = nb de classes de l’histogramme, rice = nb de classes optimisé
plt.title('Histogramme pour N simulations')
plt.xlabel('')
plt.ylabel('Nombre de tirages')
plt.show()
