def P(n): #fonction théorique pour la probabilité qu'aucun passage ne s'installe à sa place.
    S = 0
    u = 1
    for k in range(0,n+1):
        S+= u #on ajoute u à S
        u *= -1/(k+1) #u vaut le terme qu'on doit rajouter ensuite : (-1)^k/(k+1)!
    return S

#On trouve P(500) = 0.3678...

def simu_P(n,N): #simulation de la même probabilité, avec N essais
    from random import shuffle
    compt = 0
    for i in range(N):
        L = [k for k in range(n)]
        shuffle(L)
        c = 0
        while(c < n and L[c] != c): #tant qu'aucun passager n'est à la bonne place et qu'il en reste
            c += 1
        if c == n: #si on a trouvé un dérangement
            compt += 1 #on augmente le compteur
    return compt/N

#On trouve simu_P(500,10000) = 0.3673. C'est cohérent avec le résultat théorique.