# TP 21 correction : Aléatoire
# BCPST1B 2025-2026
# Lycée Hoche, Versailles
# L.-C. LEFÈVRE

# une fois pour toutes
import random as rd

#%% exercice 1.1

def pileface():
    x = rd.randint(1, 2)
    if x == 1:
        print("pile")
    else:
        print("face")

# test : une seule fois
pileface()

#%% exercice 1.2

def pilefaces(n):
    for i in range(n):
        x = rd.randint(1, 2)
        if x == 1:
            print("pile")
        else:
            print("face")

# test : 10 fois
pilefaces(10)

#%% exercice 1.3

def compte_pilefaces(n):
    p = 0
    f = 0
    for i in range(n):
        x = rd.randint(1, 2)
        if x == 1:
            p = p + 1
        else:
            f = f + 1
    return [p, f]

print(compte_pilefaces(100))

#%% exercice 1.4

def simule_pilefaces(n):
    p = 0
    f = 0
    for i in range(n):
        x = rd.randint(1, 2)
        if x == 1:
            p = p + 1
        else:
            f = f + 1
    return [p / n * 100, f / n * 100]

# test : un million
print(simule_pilefaces(1000000))

#%% exercice 2

# version 1 : compte
def simule_dé(n):
    C = [0] * 6
    for i in range(n):
        x = rd.randint(1, 6)
        C[x-1] += 1
    return C

print(simule_dé(100))

#%%

# version 2 : pourcentages
def simule_dé(n):
    C = [0] * 6
    for i in range(n):
        x = rd.randint(1, 6)
        C[x-1] += 1
    for x in range(6):
        C[x] = C[x] / n * 100
    return C

# test : le million
print(simule_dé(1000000))

#%% exercice 3

# version 1 : compte
def simule_pièce_biaisée(n):
    p = 0
    f = 0
    for i in range(n):
        x = rd.random()
        if x < 0.7:
            p = p + 1
        else:
            f = f + 1
    return [p, f]

print(simule_pièce_biaisée(100))

#%%

# version 2 : pourcentages
def simule_pièce_biaisée(n):
    p = 0
    f = 0
    for i in range(n):
        x = rd.random()
        if x < 0.7:
            p = p + 1
        else:
            f = f + 1
    return [p / n * 100, f / n * 100]

# test : le million
print(simule_pièce_biaisée(1000000))

#%% exercice 4.1

def choix_boulangerie():
    x = rd.random()
    if x < 0.45:
        return "pain au chocolat"
    elif x < 0.75:
        return "croissant"
    elif x < 0.95:
        return "pain suisse"
    else:
        return "baguette"

# test : 20 fois
for _ in range(20):
    print(choix_boulangerie())

#%% exercice 4.2

def simule_boulangerie(n):
    C = {"pain au chocolat": 0, "croissant": 0, "pain suisse": 0, "baguette": 0}
    for i in range(n):
        x = choix_boulangerie()
        C[x] += 1
    return C

print(simule_boulangerie(1000))

#%% exercice 4.3

def simule_boulangerie_allemande(n):
    C = {"Schokocroissant": 0, "Laugendreieck": 0, "Mohnbrötchen": 0, "Scharferkumpel": 0, "Rosinenschnecke": 0, "Erdbeerplunder": 0}
    for i in range(n):
        x = rd.random()
        if x < 0.32:
            C["Schokocroissant"] += 1
        elif x < 0.51:
            C["Laugendreieck"] += 1
        elif x < 0.57:
            C["Mohnbrötchen"] += 1
        elif x < 0.70:
            C["Scharferkumpel"] += 1
        elif x < 0.91:
            C["Rosinenschnecke"] += 1
        else:
            C["Erdbeerplunder"] += 1
    # convertit en pourcentages
    for c in C.keys():
        C[c] = C[c] / n * 100
    return C

print(simule_boulangerie_allemande(10000))

#%% exercice 5.1

def suivant(x):
    if x == "dormir":
        y = rd.random()
        if y < 0.8:
            return "dormir"
        else:
            return "sortir"
    elif x == "sortir":
        y = rd.random()
        if y < 0.3:
            return "sortir"
        elif y < 0.8:
            return "manger"
        else:
            return "dormir"
    elif x == "manger":
        y = rd.random()
        if y < 0.6:
            return "dormir"
        else:
            return "sortir"

#%% exercice 5.2

def simule_chat(n):
    x = "dormir"
    for i in range(n):
        x = suivant(x)
        print(x)

simule_chat(20)

#%% exercice 5.3

def simule_chat(n):
    x = "dormir"
    C = {"dormir": 0, "sortir": 0, "manger": 0}
    for i in range(n):
        x = suivant(x)
        C[x] += 1
    # conversion en pourcentage
    for x in C.keys():
        C[x] = C[x] / n * 100
    return C

print(simule_chat(10000))

#%% exercice 6

def simule_pi(n):
    p = 0
    for _ in range(n):
        x = rd.random()
        y = rd.random()
        if x**2 + y**2 <= 1:
            p = p + 1
    return p / n * 4

# test : un million
print(simule_pi(1000000))

#%% exercice 7.1

def simule_urne(n):
    a = 1
    b = 1
    for i in range(n):
        # choix au hasard entre rouges et bleues, il y a au total i+2 boules
        x = rd.randint(1, i+2)
        if x <= a:
            a = a + 1
        else:
            b = b + 1
    return [a, b]

#%% exercice 7.2

def simule_composition_urne(n, N):
    C = [0] * (n+3)
    for _ in range(N):
        L = simule_urne(n)
        a = L[0]
        C[a] += 1
    for i in range(n+3):
        C[i] = C[i] / N * 100
    return C

print(simule_composition_urne(10, 10000))
