\documentclass[a4paper, 11pt]{article}
\usepackage[pythontex]{cp-sujet}
\newcommand{\nomfichier}{[2GT.ALGO04] Python et simulation v2}
\author{Pierquet}
\title{\nomfichier}
\hypersetup{pdfauthor={Pierquet},pdftitle={\nomfichier},allbordercolors=white,pdfstartview=FitH}  

\begin{document}

\pagestyle{fancy}
\lhead{\entete{[ALGO]}}
\chead{\entete{\lycee}}
\rhead{\entete{2GT - Mars 2018}}
\lfoot{\pied{}}
\cfoot{\pied{- \thepage{} -}}
\rfoot{\pied{}}

\grandtitre{Python et simulation, première partie}

\section{Un principe général, choses utiles}

Pour faire "simple", on va faire de la simulation en utilisant Python en procédant comme suit :
\begin{itemize}
	\item on déclare l'univers sous forme d'une liste (fixe)
	\item on va tirer au sort au hasard dans la liste (avec ou sans remise)
	\item on va créer une liste de résultats
	\item on va compter le nombre d'occurrence de chaque résultat
	\item on va déterminer la fréquence (probabilité) de chaque résultat
	\item on peut également créer un graphique associé au tirage aléatoire
\end{itemize}

Les modules utiles sont \texttt{math} (pour tout ce qui est opérations mathématiques), \texttt{pylab} (pour tout ce qui est graphique) et \texttt{random} (pour tout ce qui touche à l'aléatoire) 

\section{On commence avec un dé à 6 faces}

Pour commencer, on va \textbf{uniquement} utiliser la \textit{console} d'EduPython (avec les chevrons \texttt{\blue >{}>{}>}) pour un premier contact :
\begin{itemize}
	\item il faut taper vraiment tout ce qui est tapé, en faisant attention à la syntaxe et aux décalages (identation)
	\item Les \og : \fg{} qui apparaissent à la fin de certaines lignes permettent de générer une indentation automatique
	\item pour recopier une commande, on peut utiliser un copier coller, ou bien utiliser les flèches $\uparrow\downarrow$ au niveau du dernier \texttt{\blue >{}>{}>}
\end{itemize}

\begin{pyconsole}[][framesep=3mm,frame=single,label={[\footnotesize Début de la console]\footnotesize Fin de la console}]
from math import *
from random import *
univers = [1,2,3,4,5,6] # ou bien univers = range(1,7)
print("Un tirage aléatoire :",choice(univers))
liste_tirages = []
liste_tirages.append(choice(univers))
print("Après 1 tirage, on obtient :",liste_tirages)
liste_tirages.append(choice(univers))
print("Après 2 tirages, on obtient :",liste_tirages)

liste_tirages=[]
for i in range(20) : # on fait 20 fois la même chose
	liste_tirages.append(choice(univers))

print("Après 20 tirages, on obtient",liste_tirages)

def tirage(n):
	univers = [1,2,3,4,5,6]
	liste_tirages=[]
	for i in range(n):
		liste_tirages.append(choice(univers))
	return liste_tirages

tirage(25)

liste_tirages = tirage(50)
print(liste_tirages[:25]) # juste les 25 premiers
# sinon print(liste_tirages) pour tout afficher
print("Nombre de 1 =",liste_tirages.count(1))
print("Nombre de 2 =",liste_tirages.count(2))
print("Nombre de 3 =",liste_tirages.count(3))
print("Nombre de 4 =",liste_tirages.count(4))
print("Nombre de 5 =",liste_tirages.count(5))
print("Nombre de 6 =",liste_tirages.count(6))

nombres = [liste_tirages.count(i) for i in univers]
print("Voici l'effectif de chaque face :",nombres)

frequences = [liste_tirages.count(i)/50 for i in univers]
print("Voici la fréquence d'apparition de chaque face :",frequences)
\end{pyconsole}

Maintenant que tout est fonctionnel, on peut créer un script (dans l'éditeur) pour automatiser la procédure :
\begin{itemize}
	\item on rentre les commandes (la \textit{fonction}) dans la fenêtre d'édition (avec les numéros de ligne)
	\item on charge le script avec le petit triangle vert
	\item on peut aller chercher la fonction directement 
\end{itemize} 

%\medskip

%\textcolor{titrebleu}{\hrulefill{\footnotesize {\textsf{Début du script}}}}\vspace{-0.25cm}
\begin{scriptpython}
\begin{pyverbatim}[][numbers=left]
from math import *
from random import *
def frequences(n):
	univers = [1,2,3,4,5,6]
	liste_tirages=[]
	for i in range(n):
		liste_tirages.append(choice(univers))
		frequences = [liste_tirages.count(i)/n for i in univers]
	return frequences
\end{pyverbatim}
\end{scriptpython}
%\vspace{-0.33cm}\textcolor{titrebleu}{\hrulefill{\footnotesize {\textsf{Fin du script}}}}
%\medskip

Et une fois le script chargé on peut directement traiter cela dans la console en appelant la fonction \texttt{frequences} précédemment chargée

\begin{pyconcode}
from math import *
from random import *
def frequences(n):
	univers = [1,2,3,4,5,6]
	liste_tirages=[]
	for i in range(n):
		liste_tirages.append(choice(univers))
		frequences = [liste_tirages.count(i)/n for i in univers]
	return frequences

\end{pyconcode}

\begin{pyconsole}[][framesep=3mm,frame=single,label={[\footnotesize Début de la console]\footnotesize Fin de la console}]
frequences(100)
frequences(1000)
frequences(10000)
print("Et on a, de plus, 1/6 =",1/6)
\end{pyconsole}


\newpage

\section{Avec une urne contenant 35 boules blanches et 65 boules rouges}

Bon le principe étant toujours le même, on peut passer à un autre type d'expérience aléatoire, à savoir un tirage dans une urne ; voilà le script à rentrer dans la fenêtre d'édition :

\begin{scriptpython}
\begin{pyverbatim}[][numbers=left]
from math import *
from random import *
def frequences(n):
	univers,issues = ["Blanche"]*35+["Rouge"]*65, ["Blanche","Rouge"]
	liste_tirages=[]
	for i in range(n):
		liste_tirages.append(choice(univers))
		frequences = [liste_tirages.count(i)/n for i in issues]
	return frequences
\end{pyverbatim}
\end{scriptpython}

On peut maintenant appeler la fonction \texttt{frequences} après chargement du script :

\begin{pyconcode}
from math import *
from random import *
def frequences(n):
	univers,issues = ["Blanche"]*35+["Rouge"]*65, ["Blanche","Rouge"]
	liste_tirages=[]
	for i in range(n):
		liste_tirages.append(choice(univers))
		frequences = [liste_tirages.count(i)/n for i in issues]
	return frequences

\end{pyconcode}

\begin{pyconsole}[][framesep=3mm,frame=single,label={[\footnotesize Début de la console]\footnotesize Fin de la console}]
frequences(100)
frequences(1000)
frequences(10000)
\end{pyconsole}

Et si on en a le courage, on peut demander d'afficher le graphique des fréquences successives (loi des grands nombres !)

\begin{scriptpython}
\begin{pyverbatim}[][numbers=left]
from math import *
from pylab import *
from random import *
def stabilisation_frequences_urne(n):
	univers = ["Blanche"]*35+["Rouge"]*65
	issues = ["Blanche","Rouge"]
	frequence_rouge, frequence_blanche = 0,0
	liste_tirages = []
	plt.axis([0, n, 0, 1])
	plt.plot([1, n], [0.35, 0.35])
	plt.plot([1, n], [0.65, 0.65])
	plt.grid()
	for i in range(1,n):
		liste_tirages.append(choice(univers))
		frequence_rouge = liste_tirages.count("Rouge")/i
		frequence_blanche = liste_tirages.count("Blanche")/i
		plt.plot(i,frequence_rouge,'rx')
		plt.plot(i,frequence_blanche,'bx')
	return plt.show()
\end{pyverbatim}
\end{scriptpython}

On peut maintenant appeler la fonction \texttt{stabilisation} pour visualiser tout cela :
\begin{pyconcode}
from math import *
from pylab import *
from random import *
def stabilisation_frequences_urne(n):
	univers = ["Blanche"]*35+["Rouge"]*65
	issues = ["Blanche","Rouge"]
	frequence_rouge, frequence_blanche = 0,0
	liste_tirages = []
	plt.axis([0, n, 0, 1])
	plt.plot([1, n], [0.35, 0.35])
	plt.plot([1, n], [0.65, 0.65])
	plt.grid()
	for i in range(1,n):
		liste_tirages.append(choice(univers))
		frequence_rouge = liste_tirages.count("Rouge")/i
		frequence_blanche = liste_tirages.count("Blanche")/i
		plt.plot(i,frequence_rouge,'rx')
		plt.plot(i,frequence_blanche,'bx')
	plt.savefig('tp04_plot_1.png')
	return plt.show()

def stabilisation_frequences_roue(n):
	univers = ["Noir"]+["Bleu"]*2+["Vert"]*2+["Rouge"]*3
	issues = ["Noir","Bleu","Vert","Rouge"]
	frn, frb, frv, frr = 0,0,0,0
	liste_tirages = []
	plt.axis([0, n, 0, 1])
	plt.grid()
	for i in range(1,n):
		liste_tirages.append(choice(univers))
		frn = liste_tirages.count("Noir")/i
		frb = liste_tirages.count("Bleu")/i
		frv = liste_tirages.count("Vert")/i
		frr = liste_tirages.count("Rouge")/i
		plt.plot(i,frr,'rx')
		plt.plot(i,frb,'bx')
		plt.plot(i,frv,'gx')
		plt.plot(i,frn,'kx')
	plt.savefig('tp04_plot_2.png')
	return plt.show()

\end{pyconcode}

\begin{pyconsole}[][framesep=3mm,frame=single,label={[\footnotesize Début de la console]\footnotesize Fin de la console}]
stabilisation_frequences_urne(1000)
\end{pyconsole}

\begin{center}
	\IG[scale=0.85]{./algo/tp04_plot_1.png}
\end{center}

\section{À vous de jouer avec la roue à secteurs définie dans le cours}

On a vu, en guise d'exemple sur la loi de probabilités, une roue avec 8 secteurs ; essayer d'adapter le script précédent pour obtenir un graphique similaire au suivant :
\begin{pyconsole}[][framesep=3mm,frame=single,label={[\footnotesize Début de la console]\footnotesize Fin de la console}]
stabilisation_frequences_roue(1000)
\end{pyconsole}

\begin{center}
	\IG[scale=0.85]{./algo/tp04_plot_2.png}
\end{center}

\end{document}