%-*- coding: utf-8 -*-
\documentclass[11pt]{article}

%Paquets
\usepackage{nicefrac}
\usepackage{supertabular,vmargin}
\usepackage[english,frenchb]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{cite}
\usepackage{upgreek}
\usepackage{multicol}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{graphicx}
\usepackage{enumerate}
\usepackage{stmaryrd}
\usepackage{ulem}
\usepackage{verbatim}
\usepackage{dsfont}
\usepackage{amsthm}
\usepackage{slashbox}
\usepackage{color}
\usepackage{multicol}
\usepackage{boiboites}

\newboxedtheorem[size=.44\textwidth]{uneboite}{La méthode de Von Neumann}{}
% Première marge
\definecolor{gris}{rgb}{.9,.9,.9}
\newcommand\makefirstmargin{\marginpar{\vspace*{0mm}
\usefont{T1}{pag}{b}{n}
\fontsize{90}{0}  \selectfont
\rotatebox{90}{\textcolor{gris}{0100110000\!\!\!}}}}

%Deuxième marge
\newcommand{\miroirvert}[1]{%
   \raisebox{1ex}{\rotatebox{90}{\reflectbox{{#1}}}}}

\newcommand\makesecondmargin{\marginpar{\hspace*{2mm}
\usefont{T1}{pag}{b}{n}
\fontsize{90}{0}  \selectfont
\miroirvert{\textcolor{gris}{010100000\!\!\!\!\!\!}}}}

% Mise en page
\usepackage[twocolumn,marginparwidth=3cm,a4paper,landscape,top=4.8cm,
bottom=0cm,left=6.5cm,right=0cm,columnsep=30pt]{geometry}

\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyfoot{}
\rhead{}
\lhead{\usefont{T1}{pag}{b}{n}  \selectfont \Large Les générateurs pseudo-aléatoires}
% \rhead{Analyse - Starter ST\\2011-2012}
\renewcommand{\footrulewidth}{0.4pt}
\rfoot{Universit\'e de Franche-Comt\'e}
\setlength{\headheight}{18pt}


% Théorèmes
\newtheoremstyle{note}% name
  {3pt}%Space above
  {1.5em}%Space below
  {}%Body font
  {}%Indent amount 1
  {\bfseries}% Theorem head font
  {.}%Punctuation after theorem head
  {.5em}%Space after theorem head 2
  {}%
\theoremstyle{note}
\newtheorem{enonce}{Exercice}
\newtheorem{exercice}{Exercice}
\newtheorem{exo}[exercice]{Exercice}
\newtheorem{qc}[exercice]{Question de cours}
\newtheorem*{indication}{Indications}
\newtheorem*{correction}{Correction}
% \everymath{\displaystyle}


%Commandes perso
\renewcommand{\P}{\mathbb{P}}
\newcommand{\E}{\mathbb{E}}
\newcommand{\Var}{\mathbb{V}\textrm{ar}}
\DeclareMathOperator{\ch}{\mathrm{ch}}

% Polices
%\usepackage{cmbright}
\renewcommand{\familydefault}{\sfdefault}
\usepackage{sansmath}
\sansmath

\usepackage{palatino}
\usepackage[cm]{sfmath}
\newcommand\sfont{\fontfamily{cmss}\selectfont}



\begin{document}


\makefirstmargin \vspace{-1.3cm}


\section*{$\diamondsuit$ Introduction}

Peut-on programmer un ordinateur pour générer des nombres aléatoires ? S'ils sont issus d'un
algorithme, ces nombres sont-ils \textit{vraiment} aléatoires ? Et au fait, à quoi ça sert ?

Choisissez dans cette feuille ce qui vous fait le plus envie et lancez-vous ! Et surtout, n'hésitez
pas à demander de l'aide dès que vous en avez besoin !



\section*{$\clubsuit$ Lois de probabilité et petits jeux}

Vous pouvez utiliser la fonction \texttt{random()} qui rend un nombre choisi aléatoirement
entre $0$ et $1$.
\medskip
\begin{itemize}
    \item Comment faire pour jouer à "pile ou face" ?
    \item Comment demander à l'ordinateur de simuler un lancer de dé ?
    \item Comment jouer à "Pierre, papier, ciseaux" contre l'ordinateur ? Êtes-vous plus fort que
        lui ? Provoquez l'ordinateur du voisin en duel !
    \item Comment tirer un nombre au hasard dans l'intervalle $[0,2]$ ? Dans l'intervalle $[-1,1]$ ?
    \item Comment tirer un nombre au hasard dans le disque unité ?
\end{itemize}


\section*{$\spadesuit$ Applications diverses}

\begin{itemize}
    \item Est-il possible de déterminer une valeur approchée de $\pi$ à l'aide d'un générateur
        pseudo-aléatoire ?
    \item Pour ceux qui ont déjà vu les lois binomiales en cours, comment en simuler une ? Comment
        en déduire une valeur approchée des coefficients binomiaux ?
\end{itemize}

\newpage
% \section*{La méthode de Von Neumann}
% La méthode de Von Neumann permet de générer des nombres de manière "aléatoire". Elle consiste à
% partir d'un
% nombre (appelé \textit{graine}), à l'élever au
% carré et à prendre les chiffres du milieu en sortie. Par exemple :
% \begin{itemize}
%  \item graine : $1234$
%  \item $1234^2 = 1522756$
%  \item On récupère les chiffres du milieu : $2275$ et on recommence avec $2275$.
% \end{itemize}
% Von Neumann utilisait des nombres à $10$ chiffres.
% \begin{itemize}
%  \item Essayer d'implémenter cette méthode. Comment faire pour récupérer des nombres entre $0$ et
%         $1$ ?
%  \item Proposer une autre méthode inspirée de celle-ci (on pourra utiliser les fonctions usuelles
%     vues en cours de mathématiques).
%  \item Comment vérifier graphiquement que les nombres générés sont bien répartis uniformément sur
%     $[0,1]$ ?
% \end{itemize}


\begin{uneboite}
% \section*{La méthode de Von Neumann}
La méthode de Neumann permet de générer des nombres de manière "aléatoire". Elle consiste à
partir d'un
nombre (appelé \textit{graine}), à l'élever au
carré et à prendre les chiffres du milieu en sortie. Par exemple :
\begin{itemize}
 \item graine : $1234$;
 \item $1234^2 = 1522756$;
 \item on récupère les chiffres du milieu : $2275$ et on recommence avec $2275$.
\end{itemize}
Von Neumann utilisait des nombres à $10$ chiffres.
\begin{itemize}
 \item Essayez d'implémenter cette méthode. Comment faire pour récupérer des nombres entre $0$ et
        $1$ ?
 \item Est-ce que vous pouvez penser à une autre méthode pour générer des nombres entre $0$
    et $1$ ? 
 \item Peut-on vérifier graphiquement que les nombres générés sont bien répartis uniformément sur
    $[0,1]$ ?
\end{itemize}
\end{uneboite}


\vfill
\begin{flushright}
\includegraphics[width=.4\textwidth]{des} 
\end{flushright}



\newpage
% \vspace{-6cm}


\section*{$\heartsuit$ Premiers pas en Python}

Python est un langage de programmation dont la syntaxe est particulièrement simple, il est très
puissant et très utilisé (le créateur de ce langage travaille chez Google et la Nasa l'utilise
aussi, pour ne citer qu'eux !).

Pour vous familiariser avec le langage Python, essayez ces quelques commandes directement
dans la console :
\bigskip
\hrule\medskip
\noindent a = \textbf{array}([0,1,2,3])\\
a[2] \\
a[2] = 1\\
\textbf{print} "Le nouveau tableau est", a\\
b = \textbf{array}([2,3,3,4])\\
\textbf{plot}(a,b,"x")\\
\textbf{show()}
\medskip\hrule

\makesecondmargin
\subsection*{$\blacktriangleright$ L'instruction "if"}

En Python, pour délimiter les blocs de code, on utilise \textit{l'indentation}. Cela consiste à
mettre des espaces devant le code. On pourra utiliser la touche \textit{tabulation} pour le faire.
Cette touche se trouve sur la gauche de votre clavier et ressemble à ~ {\Large $\leftrightarrows$}.

Par exemple, étant donnés deux nombres $a$ et $b$, si on veut demander à l'ordinateur de stocker le
minimum entre $a$ et $b$, on pourra écrire :

\bigskip
\hrule
\begin{multicols}{2}
  \noindent \textbf{if} $a < b$:
  
  \noindent\qquad $z = a$

  \noindent \textbf{else}:
  
  \noindent\qquad $z = b$
  
  \columnbreak
  
  \noindent Si $a <b$ alors \\
  $z = a$ ;\\
  sinon,\\
  $z = b$.
\end{multicols}

\hrule

% \newpage
\subsection*{$\blacktriangleright$ La boucle for}
Comme pour l'instruction \textbf{if}, le bloc d'instruction de la boucle \textbf{for} est délimité
par des espaces. Voici un exemple de code :

\bigskip 
\hrule
\begin{multicols}{2}
  \noindent x = \textbf{array}([\,\,])

  \noindent \textbf{for} $i$ \textbf{in range}($10$):
  
  \noindent\qquad x = \textbf{append}(x,$i$)

  \columnbreak
  
  \noindent x est un tableau vide
  
  \noindent $i$ vaut $1$, $2,\ldots,10$
  
  \noindent on ajoute $i$ au tableau
\end{multicols}
\hrule


\subsection*{$\blacktriangleright$ Pour cet atelier}

Vous pouvez écrire votre code dans l'éditeur de texte (sauvez-le avec une extension \texttt{.py}
pour que le logiciel colorie votre code) et copier/coller votre code dans la console.
Pour l'occasion on a écrit une fonction \textbf{milieu} qui permet de récupérer les décimales au
milieu d'un nombre. Vous pouvez la tester dans la console :
\bigskip
\hrule\medskip
\noindent \textbf{milieu}$(12345678, 4)$ \quad \# \!rend en sortie $3456$.
\medskip\hrule
\medskip

\noindent Pour élever un nombre $x$ au carré, on écrira : $x\!*\!*2$.

\vfill
\section*{\raisebox{.1em}{$\bigstar$} Pour aller plus loin}

\noindent $\bullet$ La page wikipédia sur les
générateurs pseudo-aléatoires :\\
\texttt{http://fr.wikipedia.org/wiki/Générateur\_de\_}
\vspace{-.3cm}
\begin{flushright}
\texttt{nombres\_pseudo-aléatoires} 
\end{flushright}

\noindent $\bullet$ Les librairies Python utilisées aujourd'hui :
\begin{itemize}
     \item \texttt{numpy} (librairie de calcul numérique);
     \item \texttt{matplotlib} (pour faire des graphiques);
\end{itemize}

\medskip
\noindent $\bullet$ Contacts :
\begin{itemize}
     \item \texttt{celine.caldini@gmail.com}
     \item \texttt{alexis.flesch@gmail.com}
\end{itemize}

 



\end{document}