import random as rd
import matplotlib.pyplot as plt
import math


#1
def val_pi(n) :
    c = 0   # compteur pour le nombre de points sur le quart de disque
    for i in range(n) :
        x = rd.random()
        y = rd.random()
        if x**2 + y**2 < 1 :
            c += 1
    val = 4*c/n
    ref = math.pi
    return val,abs(val-ref)/ref


#2.1
liste = [1.7,2,2.6,2.9,3.1,3.4,3.5,3.7,4.1,4.2,4.4,4.5,4.8,5.4,5.9]

def moyenne(tab) :
    n = len(tab)
    s = 0
    for val in tab :
        s += val
    return s/n

def ecart_type(tab) :
    n = len(tab)
    m = moyenne(tab)
    s = 0
    for val in tab :
        s += (val-m)**2
    return math.sqrt(s/n)


#2.2
def histogramme(tab,n) :
    plt.figure()
    plt.hist(tab,bins=n)
    plt.show()


#2.3
def intervalle(moyenne,largeur) :
    def out() :
        return moyenne+(rd.random()-0.5)*largeur
    return out

def echantillon(fonction,nb_tirages) :
    out = []
    for _ in range(nb_tirages) :
        out.append(fonction())
    return out

#histogramme(echantillon(intervalle(10,1),10000),20)


#2.4
def somme(f1,f2) :
    def out() :
        return f1()+f2()
    return out

def produit(f1,f2) :
    def out() :
        return f1()*f2()
    return out

#histogramme(echantillon(produit(intervalle(10,1),intervalle(10,1)),10000),20)
#histogramme(echantillon(somme(intervalle(10,1),intervalle(10,1)),10000),20)


#3.1
#print(ecart_type(echantillon(intervalle(100,2),1000000)),1/math.sqrt(3))


#3.2
# print(2/math.sqrt(3),2/math.sqrt(3)/200,3/math.sqrt(3),3/math.sqrt(3)/500)
# tab = echantillon(produit(intervalle(200,4),intervalle(500,6)),1000000)
# print(ecart_type(tab),ecart_type(tab)/(200*500))
# histogramme(tab,100)


#3.3
def quotient(f1,f2) :
    def out() :
        return f1()/f2()
    return out

# tab = echantillon(quotient(intervalle(12.63,0.04),intervalle(0.0187,0.0002)),1000000)
# print(12.63/0.0187,ecart_type(tab),ecart_type(tab)/(12.63/0.0187))
# histogramme(tab,100)


#4.1
def gauss(m,sigma) :
    def out(x) :
        return 1/(sigma*math.sqrt(2*math.pi))*math.exp(-(x-m)**2/sigma**2)
    return out

def rep_gauss(m,sigma) :
    lx=[m-3*sigma+i*6*sigma/1000 for i in range(1000)]
    ly = [gauss(m,sigma)(x) for x in lx]
    plt.figure()
    plt.plot(lx,ly)
    plt.savefig('/Users/vincent/Desktop/gauss')
    plt.show()


#4.2
def somme_n(f,n) :
    def out() :
        s = 0
        for _ in range(n) :
            s += f()
        return s
    return out

# for n in range(10,0,-1) :
#     tab = echantillon(somme_n(intervalle(0,1),n),100000)
#     histogramme(tab,100)


#4.3
# tab = echantillon(somme_n(intervalle(0,1),10),1000000)
# histogramme(tab,100)
# rep_gauss(0,ecart_type(tab))

