2nd-Python CNED 2021-2022
2nd-Python CNED 2021-2022
2nd-Python CNED 2021-2022
Algorithmique
Objectifs
• Revoir les notions d’algorithme, de programme et de variable,
• Résumer les principales instructions et notations utilisées en algorithmique,
• Apprendre à tester un algorithme,
• À partir d’un algorithme donné, déterminer le problème qu’il permet de résoudre,
• Au travers des exemples choisis, travailler vos savoirs sur les nombres.
Exemple.
Lorsque l’on cherche un mot dans un dictionnaire, on applique généralement l’algorithme suivant.
On ouvre le dictionnaire au hasard.
On compare la première lettre du mot avec celle du premier mot de la page où le dictionnaire
est ouvert. Suivant les positions relatives dans l’ordre alphabétique de ces deux lettres, on
tourne les pages en avant ou en arrière. On recommence avec les deuxièmes, troisièmes, …
lettres jusqu’à trouver la page contenant le mot.
On recommence à comparer les lettres dans l’ordre d’apparition du mot avec celles des mots de
la page jusqu’à trouver le mot.
Donnée
Étiquette
Variable
Image modifiée illustrative de la notion de variable
Crédits : Murata Yuki
Collection : iStock / Getty Images Plus
Ligne de Ligne de
Instruction
l’algorithme l’algorithme r ≥ 42 ? q r
exécutée
L1 r ← 100
L2 q←0 L1 100
L3 Tant que r ≥ 42 faire L2 0
L4 q ← q+1 L3 True
L5 r ← r − 42 L4 1
L6 Fin Tant que L5 58
L3 True
L4 2
L5 16
L3 False
L6
Pour simplifier, on peut regrouper les lignes d’initialisation des variables (L1 et L2) lorsque celles-ci sont
indépendantes. On peut aussi regrouper la ligne associée à l’instruction Tant que (L3) avec les lignes de
traitement (ici L4 et L5). On obtient le tableau suivant.
r ≥ 42 ? q r
Initialisation 0 100
True 1 58
Traitement True 2 16
False
Le quotient de la division entière (ou euclidienne) de100 par 42, est 2 car 100 = 2 × 42 + 16. Notre
algorithme permet de calculer ce quotient et le reste, il s’agit respectivement de la valeur de q et de r.
Exercice A. On se donne deux entiers a et b avec a > b. Écrire un algorithme qui calcule le quotient et le
reste de la division entière de a par b.
Tester votre algorithme pour a = 100 et b = 42, puis pour a = 100 et b = 25.
Pour a = 100 et b = 42, on retrouve notre algorithme précédent que nous avons déjà testé et suivi.
Testons pour a = 100 et b = 25.
r ≥ 25 ? q r
Initialisation 0 100
True 1 75
True 2 50
Traitement True 3 25
True 4 0
False
Remarque. Si on remplace la condition r ≥ b par r > b, l’algorithme ne fonctionne pas dans le cas où a est
un multiple de b.
Exercice B. Approximation de 2
On trouve, dans les anciens livres indiens dénommés Sullasutras (800-200av.J. C.), une approximation de
2 définie par ces mots: « On augmente la longueur du côté par un tiers et ce tiers par son quart et on
retranche le trente-quatrième de ce quart ».
On obtient A = 1 + 1 + 1 − 1 .
3 3 × 4 3 × 4 × 34
p
1. Mettre A sous forme d’une fraction irréductible.
q
Solution. A = 577 avec 577 qui est un nombre premier.
408
2. Peut-on avoir A = 2 ? Expliquer votre réponse sans utiliser de calculatrice.
Solution. Si A = 2 alors A2 = 2 et donc 5772 = 2 × 4082 or 5772 = 332929 est impair et 2 × 4082
est pair donc l’égalité est impossible.
3. Calculer la différence entre 2 et A, cette différence s’appelle l’erreur commise en approchant 2 par
le nombre A.
2 −0,01 ≤ 2 − A ≤ 0,01 …
…
L’entier cherché est donc p = 5 et on a l’encadrement −10−5 ≤ 2 − A ≤ 10−5. On dit que l’on a un
encadrement à 10−5 près de l’erreur.
erreur ← 2 − ⎛⎜1 + 1 ⎞⎟
⎝ 3⎠
Tant que erreur ≥ 10−5 ou erreur ≤ −10−5 faire
n ← n+ 1
F ←1 + 1 + 1 − 1
3 3×4 3×4×n
erreur ← 2 − F
Fin Tant que
Solution. Cet algorithme permet de trouver le plus petit entier n tel que le nombre F soit une approxi-
mation de 2 avec une erreur comprise entre −10−5 et10−5.
En programmant cet algorithme, on obtient n = 34.
CHAPITRE 4
1. Objectifs
• Utiliser les variables, les types et faire des affections en Python. En particulier, introduire les types de
nombres (entier, flottant), le type chaîne de caractères et le type booléen.
• Faire des entrées-sorties en Python.
2. Variables et affectation
Mémoire
3. Éditeur Python
Lorsque vous avez plusieurs instructions à exécuter, vous pouvez ouvrir un fichier à partir du menu File/
New file, comme indiquer ci-dessous.
Une nouvelle fenêtre apparait que l’on appelle l’éditeur. Vous pouvez taper dans cette fenêtre une série
d’instructions. Il s’agit d’un éditeur de texte, comme Open Office par exemple, mais adapté à Python. Pour
exécuter les instructions, il faut
• sauvegarder le fichier où vous avez tapé vos instructions : dans le menu File de l’éditeur, sélectionner
Save As pour une première sauvegarde ou Save pour les sauvegardes suivantes,
• puis aller dans le menu Run de l’éditeur et sélectionner Run Module (voir ci-dessous).
Le programme IDLE est un environnement de développement (IDE) intégré dans Python. Quel que soit
l’IDE, il comportera toujours un interpréteur et un éditeur plus ou moins complexe. Le but d’un IDE étant
de faciliter le travail des programmeurs, l’éditeur met généralement en couleur les éléments du langage
et propose des complétions automatiques (et bien d’autres facilités…).
Il existe beaucoup d’environnements de développement (IDE) pour Python. Nous avons choisi celui-ci
car il est intégré à toutes les distributions Python, donc il ne nécessite pas d’installation spécifique, il
fonctionne sur tout système d’exploitation et il suffit à nos besoins.
Solution
2. Voici un exemple d’exécution.
n = int(input("Donner un entier n, n = ")) #On demande d’entrer un entier que l’on affecte à n.
est_pair = n%2==0
#On teste si cet entier n est pair (si oui, le reste de sa division euclidienne par 2 est 0).
#La variable <est_pair> est un booléen.
print("L’entier ",n," est pair, est une affirmation : ",est_pair,".") #On affiche le résultat.
m = input(‘Donner un nombre m, m = ‘) #On demande d’entrer un nombre que l’on affecte à m.
print("La variable m est de type : ",type(m)) #On affiche le type de m.
print("Attention ! m n’est pas de type number mais de type string.")
#On affiche un message, notez bien que le type d’une variable affectée avec une saisie clavier
#par la commande <input()> est une chaîne de caractères.
est_multiple_de_3 = n%3 == 0
#On teste si l’entier n est un multiple de 3 (si oui, le reste de sa division euclidienne par 3 est 0).
#La variable est_multiple_de_3 est un booléen.
print("L’entier ",n," est un multiple de 3, est une affirmation : ",est_multiple_de_3,".") #On affiche le
résultat.
Remarques.
• La fonction input() donne toujours une chaîne de caractère, la fonction int(<chaîne>) convertit <chaîne>
en un entier, de même float(<chaîne>) convertit <chaîne> en un nombre flottant. Attention, la fonction
bool(<n’importe quoi>) donne toujours True (sauf si <n’importe quoi> est une liste ou un ensemble
vide).
• Pour faciliter la relecture et la compréhension d’un programme, il faut essayer de donner des noms
significatifs aux différentes variables.
Exercice D.
On veut affecter le nombre 1 + 2 à la variable <x>.
3
1. Taper l’instruction suivante, saisir 1+2/3 et observer.
>>> x=float(input(‘Donner un réel x :’))
>>> x
>>> x
Solution
1. On obtient une erreur :
>>> x
>>>
>>> x
1.6666666666666665
>>>
Remarque
Pour saisir en entrée, un nombre défini par une expression mathématique, comme par exemple 1 + 2 , on
utilise l’instruction eval(input (« <texte> »)). 3
5. Synthèse du TP
L’affectation s’effectue par le symbole < = >.
Nous avons rencontré le type int, pour « entier », le type float, pour « réel » (ou plus exactement les
nombres flottants qui sont une représentation informatique des nombres réels), le type str, abréviation de
string, pour « chaîne de caractères » et le type bool, pour « booléen ».
La fonction type(<var>) donne le type de la variable <var>.
Voici un résumé des principales instructions d’entrées-sorties en Python.
Fonction Description
CHAPITRE 4
1. Objectifs
• Se familiariser avec les connecteurs logiques.
• Utiliser des instructions conditionnelles en Python.
• Utiliser les boucles « Pour » et « Tant que » en Python.
2. Un peu de logique
>>> x !=4 Instruction 3 : Elle vaut Vrai si <x> est différent de 4
True et Faux sinon.
>>> x <= 5 Instruction 6 : Elle vaut Vrai si <x> est inférieur ou
True égale à 5 (si x ∈ ⎦⎤−∞ ; 5⎤⎦ ) et Faux sinon.
>>> x < 2 or x > 4 Instruction 8 : Elle vaut Vrai si <x> est strictement
True supérieur à 2 ou strictement supérieur à 4 (si
>>> x ∈ ⎦⎤−∞ ; 2⎡⎣ ∪ ⎤⎦4 ; + ∞ ⎡⎣ , et Faux sinon.
#Entrées
if poids <= 2:
prix = 10 * poids
else:
prix = 5 * poids + 10
#Sorties
Remarques
• On appelle <test> une instruction dont le résultat est un booléen, c’est-à-dire une variable qui ne
peut prendre que 2 valeurs : Vrai et Faux. Par exemple, prenons l’instruction < a == b>. On se pose la
question « Est-ce que a est égal à b ? », le résultat de l’instruction est la réponse à notre question : Vrai
si a et b sont égaux et Faux sinon, en Python, <True> ou <False>.
À ne pas confondre avec l’instruction <a = b> qui signifie « affecter la valeur de b à la variable a ».
• Le début de la suite des instructions dans une conditionnelle se signale par une indentation de
4 espaces. La fin de l’indentation marque la fin de la suite des instructions à effectuer dans la
conditionnelle.
4. Les boucles
En algorithmique, on utilise les boucles pour répéter une suite d’instructions ; on distingue deux types de
boucles :
• les boucles bornées : boucle « Pour », lorsque l’on connaît le nombre de fois où l’on va répéter la suite
d’instructions,
• les boucles non bornées : boucle « Tant que », lorsque l’on ne sait pas combien de fois, il va falloir
répéter les instructions. On répète les instructions tant qu’une condition n’est pas satisfaite. Il est alors
important de vérifier que cette condition d’arrêt sera bien atteinte en un nombre fini de répétitions.
#Traitement
S = 0
S = S + n
#Sorties
Solution
2. Voici deux exemples d’exécution
Donner un entier naturel: N = 4
Le résultat est : 10
Le résultat est : 15
3. Ce programme calcule la somme des N premiers entiers où N est un entier naturel saisie au clavier.
Remarques.
• La commande <range(1, N+1)> crée la liste des N premiers entiers : [1, 2, 3, …,N-1, N].
Plus généralement, la commande <range(d, f, pas )> crée la liste des entiers de d inclus à f exclu en
augmentant de <pas>. Voici un exemple exécuté dans l’interpréteur.
On demande d’afficher les éléments de la liste créée par la
commande <range(4, 10, 2 )>.
Cette liste est constituée des entiers de 2 en 2 compris entre 4
inclus et 10 exclu : [4, 6, 8].
• Comme pour les conditionnelles, le début de la suite des instructions dans une boucle se signale par
une indentation de 4 espaces. La fin de l’indentation marque la fin de la suite des instructions à répéter
dans la boucle.
u←1
n←n+1
u←2×u
Afficher n
1. On programme en Python cet algorithme. Ouvrir un fichier à partir de l’interpréteur et le sauver sous
le nom « TPBoucleTantQue». Entrer le programme suivant dans votre fichier.
#Traitement
n = 0
u = 1
n = n + 1
u = 2 * u
#Sorties
Solution
2. On obtient n = 10. On vérifie bien que 210 = 1024 est supérieur ou égal à 1000 et 10 est bien la
première puissance cherchée car 29 = 512.
3. Comme 0 < 0, 8 < 1, les puissances de 0,8 prennent des valeurs de plus en plus petites mais
n‘atteignent jamais 0. Il faut donc choisir un seuil strictement positif.
Voici une proposition de programme.
#Entrées
#Traitement
n = 0
n = n + 1
u = 0.8 * u
#Sorties
On exécute ce programme, on obtient n = 31, pour un seuil de 0,001. On vérifie que 0, 831 ≤ 0,001 et
0, 830 > 0,001.
5. Synthèse du TP
Voici un résumé sur les conditions et connecteurs logiques en Python, puis sur les instructions
élémentaires en Python.
Instruction Description
a == b Vraie si et seulement si a = b
a != b Vraie si et seulement si a ≠ b
a >= b Vraie si et seulement si a ≥ b
a>b Vraie si et seulement si a > b
a <= b Vraie si et seulement si a ≤ b
a<b Vraie si et seulement si a < b
Vraie si et seulement si <condition1> Vraie et <condition2>
<condition1> and <condition2>
Vraie
Vraie si et seulement si <condition1> Vraie ou <condition2>
<condition1> or <condition2>
Vraie
Not <condition> Vraie si et seulement si <condition> Fausse
Notation
Instructions Exemple Exemple Python
algorithmique
À noter. En python, le début de la suite des instructions dans une conditionnelle ou dans une
boucle se signale par une indentation de 4 espaces. La fin de l’indentation marque la fin de la
suite des instructions à effectuer dans la conditionnelle ou la boucle.
<suite d’instructions>
<suite d’instructions>
else :
<suite d’instructions>
CHAPITRE 4
A. Objectifs
• Utiliser des fonctions prédéfinies en Python
• Introduire le vocabulaire propre aux fonctions en informatique : fonction ou procédure, paramètres,
arguments, corps
• Définir ses propres fonctions (simples)
Exercice A
Taper les instructions suivantes dans l’interpréteur et observer les résultats obtenus.
>>> min(9,2)
>>> max(9,2,11,5)
>>> help(min)
Solution
Rappelons que dans une phrase explicative, nous noterons les variables et arguments entre <>, parfois
les instructions aussi, pour bien les séparer du texte.
Exercice B
a. Calculer l’image de 0, de 3 puis de 1 par la fonction f.
b. Peut-on calculer l’image de -1 ?
c. Taper les instructions suivantes dans l’éditeur, sauver ce fichier sous le nom TP4ExerciceB.py puis
exécuter.
def fpy(x):
from math import sqrt
y = -3*×**2 + sqrt(5*×+1)
return y
d. Pour tester votre fonction dans l’interpréteur, taper par exemple les instructions suivantes et observer.
>>> fpy(0)
>>> fpy(3)
>>> fpy(−1)
>>> help(fpy)
e. Pour créer une documentation sur notre fonction <fpy>, ajouter dans la définition de <fpy>, la spécifica-
tion donnée ci-dessous entre des triples guillemets.
def fpy(x):
""" number -> float
hypothèses : 5x+1>=0
retourne une valeur approchée de f(x)=3x^2+sqrt(5x+1)
pour x un nombre donné"""
from math import sqrt
y = -3*x**2 + sqrt(5*x+1)
return y
Modifier votre fichier TP4ExerciceB.py, l’exécuter puis taper à nouveau dans l’interpréteur l’instruction
suivante :
>>> help(fpy)
Solution
Remarques
• On utilise ** pour élever à une puissance donnée (ici 2).
• On aurait pu appeler notre fonction en Python <f> plutôt que <fpy> mais nous préférons distinguer la
fonction mathématique f de la fonction <fpy> définie dans le langage de programmation Python.
• Importer <sqrt> dans le corps de notre fonction est important, notre fonction est indépendante ; elle
s’exécute toujours sans que l’on soit obligé d’importer au préalable le module <math> (ou la fonction
<sqrt>).
On exécute le fichier où est écrite notre fonction.
>>> C:\Users\Nom\Documents\TPPython\TP4ExerciceB.py
e. Pour créer une documentation sur notre fonction <fpy>, on ajoute dans la définition de <fpy>, la
spécification ci-dessous.
def fpy(x):
""" number -> float
hypothèses : 5x+1>=0
retourne une valeur approchée de f(x)=3x^2+sqrt(5x+1)
pour x un nombre donné"""
from math import sqrt
y = -3*x**2 + sqrt(5*x+1)
return y
On précise qu’en entrée, la fonction <fpy> prend pour argument <x>, un nombre du type <number>
et que sa sortie est toujours un nombre du type <float>. On précise que l’utilisateur de la fonction doit
faire attention à passer en argument un nombre <x> tel que 5x + 1 ≥ 0. Effectivement, si 5x + 1 n’est
pas positif alors on ne peut pas en calculer la racine carrée. Puis, on donne la description en français
du « problème » résolu par la fonction. La spécification s’écrit entre des triples guillemets.
>>> help(fpy)
Help on function fpy in module __main__:
fpy(x)
number -> float
hypothèses : 5x+1>=0
retourne une valeur approchée de f(x)=3x^2+sqrt(5x+1)
pour x un nombre donné
Exercice C
a. Taper dans l’éditeur les instructions ci-dessous, sauvegarder votre fichier sous le nom
TP4ExerciceC.py.
def f(xM, yM):
Vrai_ou_Faux = yM < 3*xM-5
return Vrai_ou_Faux
Solution
a. et b. On interprète les instructions du corps de la fonction :
def f(xM, yM):
Vrai_ou_Faux = yM < 3*xM-5
return Vrai_ou_Faux
Cette fonction retourne le booléen True si yM < 3xM - 5, et le booléen False sinon. Autrement dit, elle
( )
retourne un booléen qui vaut True si le point M de coordonnées xM ; yM est en dessous de la droite D
d’équation y = 3x - 5.
Exécution dans
Commentaires
l’interpréteur
>>> f(1,1) Le point de coordonnées (1; 1) n’est pas en dessous de la droite D.
False
>>> f(1,-3) Le point de coordonnées (1; -3) est en dessous de la droite D.
True
Remarque
Pour les variables, les paramètres ou arguments, les fonctions et plus généralement tous les objets que
l’on utilise dans un programme, on essaye de choisir des noms significatifs.
Que proposeriez-vous pour la fonction f ? On pourrait l’appeler Est_en_dessous_D.
Exercice D
( )
a. Proposer une fonction Appartient_C qui retourne le booléen True si le point M xM ; yM appartient à la
3
courbe � d’équation y = - 5, et le booléen False sinon.
x
3 2 − 10
b. Déterminer si les points suivants appartiennent à la courbe � : A(1; -2), B(-3; 2) et C 2 ; .
2
3 2 − 10
c. Tester votre fonction sur les points A(1; -2), B(-3; 2) et C 2 ; .
2
On a
3
-3
( )
- 5 = -6 et −6 ≠ 2 donc le point B -3 ; 2 n’appartient pas à la courbe �.
3 3× 2 3 2 3 2 - 10 3 2 − 10
On a -5= -5= -5= donc le point C 2 ; appartient à la
2 2× 2 2 2 2
courbe de �?
c. On teste notre fonction en exécutant dans l’interpréteur, le programme suivant que nous avons tapé
dans l’éditeur et sauver dans un fichier TP4ExerciceD.py
def Appartient_C(xM, yM):
""" number, number -> bool
retourne le booléen True si le point M(xM;yM) appartient à la
courbe d'équation y=3/x-5"""
Vrai_ou_Faux = yM == 3/xM-5
return Vrai_ou_Faux
Le problème est que le calcul par Python de <3/xM-5> est approché ainsi que celui du nombre
<(3*sqrt(2)-10)/2> passé en argument dans la fonction Appartient_C.
On décide alors que l’on considèrera yM égal à 3/xM-5 si leur distance est inférieure à une précision
donnée que l’on appelle epsilon et que l’on choisit égale à 10-15. Autrement dit, on décide que
3
yM −
xM
( )
− 5 ≤ 10−15 signifie que le point M xM ; yM appartient à la courbe �.
RESTART: C:/Users/Nom/Documents/TPPython/TP4ExerciceDbis.py
Le point A appartient à la courbe ? True
Le point B appartient à la courbe ? False
Le point C appartient à la courbe ? True
E. Synthèse du TP
La syntaxe d’une fonction en Python est la suivante
def Nom_de_la_fonction(liste des paramètres) :
"""type des paramètres -> type de la sortie
(Hypothèses si restriction sur les paramètres)
Documentation de la fonction : ce que fait cette fonction """
Instruction 1
Instruction 2
Instruction n
(return résultat)
Groupe A
( - )
>>> maliste[:3]
[2, 6, 6]
>>> maliste[2:5]
[6, 3, 6]
>>> maliste[-1]
2
>>> maliste[-2]
6
>>> maliste[-3:]
[3, 6, 2]
>>> type(maliste)
<class 'list'>
>>>
>>> sum(maliste)
25
>>> len(maliste)
6
>>> maliste[:]=[]
>>> maliste
[]
>>> help(list)
Help on class list in module builtins:
class list(object)
| list() -> new empty list
| list(iterable) -> new list
initialized from iterable's items
|
| Methods defined here:
…
SÉQUENCE 9. PROBABILITÉS ET ÉCHANTILLONNAGES
CHAPITRE 2
Exercice A
On souhaite simuler le lancer d’un dé cubique équilibré, c’est à dire choisir au hasard un nombre entier
entre 1 et 6, chacun ayant la même probabilité d’être choisi.
Pour cela, on va utiliser le module <random> de Python qui propose différentes fonctions pour simuler le
hasard.
a) Taper les instructions suivantes dans l’interpréteur, observer et commenter.
>>> from random import *
>>> randint(1,6)
Solution a)
>>> from random import * Le module <random> comporte des fonctions pour générer des
nombres aléatoires.
>>> randint( 1, 6 ) La fonction <randint> a pour argument, deux entiers <n> et
<p>. Elle retourne un entier compris entre n inclus et p inclus,
4 choisi au hasard. Chaque entier compris entre n et p, tous deux
inclus, a la même probabilité d’être obtenu.
>>> choices( des, k=20 ) La fonction <choices> a pour arguments une liste <liste> et
<k=n>. Elle retourne une liste de n éléments, chacun ayant
été choisi dans la liste <liste> avec la même probabilité.
[1, 5, 3, 4, 3, 2, 1, 4, 6, 3, 4, 5, 4, 3, Ici, on a n = 3, on simule 3 lancers de dé cubique successifs.
4, 4, 4, 4, 2, 3] Le premier élément de la liste est le résultat du premier
lancer, le deuxième élément, le résultat du deuxième
lancer,...
Exercice B
Simuler le tirage au sort d’une lettre de l’alphabet, revient à choisir au hasard une lettre parmi les
26 lettres de l’alphabet, chacune ayant la même probabilité d’être choisie.
a) Écrire un programme qui effectue les tâches suivantes.
• Il demande le nombre n de lettres de l’alphabet à choisir.
• Il choisit n lettres parmi les 26 lettres de l’alphabet, une même lettre pouvant être choisie
plusieurs fois. On parle alors de tirage avec remise : au tirage suivant, on a encore le choix
parmi 26 lettres.
• Il affiche le mot de n lettres ainsi obtenu.
b) Modifier votre programme pour qu’on ne puisse pas choisir la même lettre. On parle alors de
tirage sans remise : une lettre étant choisie, elle ne fait plus partie de la liste des lettres que l’on
peut choisir.
Solution a)
#Module pour générer des nombres (pseudo-)aléatoires
from random import *
#On définit la liste des lettres de l’alphabet
alphabet = [ 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' ]
n = int( input( " Donner le nombre de lettres de l'alphabet à choisir: n = " ))
Solution b)
#Module pour générer des nombres (pseudo-)aléatoires
from random import *
#On définit la liste des lettres de l’alphabet
alphabet = [ 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z' ]
#On créé une copie indépendante de cette liste
copie_alphabet = alphabet[:]
n = int( input( " Donner le nombre de lettres de l'alphabet à choisir: n = " ))
#On crée un mot en concaténant les lettres obtenues dans l'ordre de tirage
mot = ''
for compteur in range( 1, n+1 ):
lettre = choice( copie_alphabet )
mot = mot + lettre
#On retire la lettre de la liste
copie_alphabet.remove( lettre )
print( "Le mot aléatoire obtenu est ", mot)
Exercice C
Comment pourrait-on simuler le tirage au sort d’une boule dans une urne qui contient 2
boules rouges et 3 boules vertes ?
Solution
#Module pour générer des nombres (pseudo-)aléatoires
>>> from random import *
#Première solution : on définit l'urne
>>> urne = [ "rouge", "rouge", "verte", "verte", "verte" ]
>>> choice( urne )
Exercice D
On considère la roulette américaine qui comporte 38 cases numérotées et
colorées. Ces cases sont numérotées de 0 à 36 et une case porte le double
zéro (00). 18 de ces cases sont noires, 18 sont rouges, le 0 et le 00 sont verts.
On ne mise que sur une « chance simple », c’est-à-dire que sur l’une des
couleurs : noire ou rouge (le vert n’est pas autorisé). À la roulette américaine, la règle est de
gagner une fois sa mise si la couleur choisie sort, sinon la mise est perdue. Par exemple, si vous
misez 10 euros sur le rouge et que le rouge sort, vous gagnez 10 euros. Sinon, vous donnez 10
euros à la banque du casino.
a) Écrire une fonction de nom ChanceSimple qui prend en argument la couleur choisie (noire ou
rouge) et votre mise. Elle retourne votre gain ou votre perte : par exemple si vous avez misé 10
euros, elle retourne 10 si votre couleur est sortie, et –10 sinon.
b) Écrire un programme qui demande votre couleur choisie et votre mise, puis affiche votre gain.
Solution
Voici une proposition de programme.
def ChanceSimple( Couleur, Mise ):
""" string, integer -> integer
Couleur est la chaîne de caractère 'rouge' ou 'noire'.
Mise est un entier positif, non nul.
La fonction retourne le gain ou la perte lorsque l'on joue une chance simple à la roulette
américaine."""
from random import choices
Issues = [‘rouge’, ‘noire’, ‘vert’ ]
Effectifs = [ 18 , 18 , 2 ]
CouleurSortie = choices( Issues, Effectifs )
if CouleurSortie[0] == Couleur:
Gain = Mise
else:
Gain = -Mise
return Gain
#Entrées
Instruction Description
randint( n, p) Retourne un entier tiré au hasard entre les entiers
<n> et <p>, tout deux inclus.
choice(Liste) Retourne un élément de la liste <Liste> choisi
aléatoirement, chacun des éléments de la liste ayant
la même probabilité d’être choisi.
choices(ListeIssues,ListeProbabilités,k=N) <ListeIssues> est la liste des issues d’une expérience
aléatoire.
<ListeProbabilités> est la liste des probabilités de
chacune des issues de la liste <ListeIssues>.
<N> est le nombre de fois où l’on répète l’expérience
aléatoire de manière identique et indépendante
(« avec remise »).
Retourne la liste des issues obtenues lorsque l’on
répète N fois l’expérience aléatoire de manière
identique et indépendante.
sample(Liste,k=N) Retourne la liste des issues obtenues après N tirages
« sans remise ».
Lors d’un tirage, on choisit aléatoirement un élément
dans la liste <Liste>, chaque élément a la même
probabilité d’être choisi. Un élément choisi est retiré
de la liste pour le prochain tirage. On parle de tirage
« sans remise ».
CHAPITRE 2
TP9. Échantillonnage
Objectifs
• Découvrir la notion d’échantillonage.
• Utiliser le module <random> pour faire des simulations.
• Réinvestir les notions vues dans les précédents travaux pratiques de programmation en
Python, en particulier les listes.
Exemples
• Lancer une pièce de monnaie équilibré est une épreuve de Bernoulli, on peut décider que
« Obtenir Face » est le « succès » et « Obtenir Pile » est l’ « échec ». Ces deux issues sont
1
équiprobables : leur probabilité est chacune de .
2
• Lancer un dé cubique et observer si on obtient 6 ou non, est une épreuve de Bernoulli. On
décide que « Obtenir un six » est le « succès » et « Obtenir un autre numéro que six » est
l’ « échec ». Dans ce cas, ces deux issues ne sont pas équiprobables : la probabilité
1 5
d’obtenir un six est et celle de ne pas obtenir un six est .
6 6
Dans cet exercice, on considère l’épreuve de Bernoulli qui consiste à lancer une pièce de monnaie
équilibrée. On note F, l’issue « Face » que l’on choisit comme « succès » et on note P, l’issue
« Pile ».
On répète n fois cette expérience, il s’agit de la même expérience et son résultat ne dépend pas de
ce que nous avons obtenu précédemment. On dit alors que l’on répète l’expérience de manière
identique et indépendante.
L’ensemble des n résultats obtenus forme un échantillon de taille n pour cette épreuve de
Bernoulli.
On s’intéresse à la fréquence de succès dans un échantillon de taille n .
Par exemple, si on répète 5 fois l’expérience et on obtient {F ,P ,F ,F ,F } , la fréquence de F dans cet
4
échantillon est .
5
b) Écrire en Python, une fonction frequence qui prend en argument n la taille de l’échantillon
(c’est à dire le nombre de fois où l’on répète l’expérience de lancer une pièce), et retourne la
fréquence de « Face » obtenues. Vous pourrez utiliser la fonction effectif définie ci-dessus.
Tester votre fonction pour différentes valeurs de n.
c) Voici un programme qui permet de tracer les fréquences obtenues pour 100 échantillons de
taille 500. Il utilise les fonctions effectif et frequence définies précédemment. Il ne faut pas oublier
de les exécuter avant de lancer le programme.
Une exécution de ce programme nous a donné le graphique ci-dessous.
En abscisse se trouve le rang de
l’échantillon de taille 500, et en
ordonnée la fréquence de « Face »
obtenue pour cet échantillon.
Qu’observez-vous ?
import matplotlib.pyplot as plt
import numpy as np
plt.axis([0,100,0,1])
plt.grid()
for nb_echantillon in range(1, 101):
f_echantillon = frequence(500)
plt.plot(nb_echantillon,
f_echantillon,'rx')
plt.show()
b) La fréquence d’obtention de « Face » est la proportion des « Face » sur l’ensemble des lancers.
Effectif des "Face" effectif (n)
On la calcule par f = , soit f = .
Nombre de lancers n
On propose la fonction suivante :
def frequence(n):
nb_face = effectif(n)
f = nb_face/n
return f
On teste notre fonction dans la console (après avoir exécuter le fichier où elle est entrée) pour
différentes tailles d’échantillon.
>>> frequence(100)
0.48
>>> frequence(50)
0.6
c) On voit que pour chaque échantillon de taille 500, on obtient une fréquence différente mais qui
est proche de 0,5. Ces variations des fréquences, pour des échantillons de même taille, s’appelle la
fluctuation de l’échantillonnage.
Solution
Voici le programme complété, nous avons écrit en bleu les complétions faites.
#Création des axes gradués et de la grille
#Abscisses : de 0 à 500, ordonnées : de 0 à 1
plt.axis([0, 500, 0, 1])
plt.grid()
#Création de la droite y=0.5
x = np.linspace(0, 500, 500)
plt.plot(x,0*x+0.5)
#Création du nuage de points
for n in range(1, 501, 5):
f_n = frequence(n)
plt.plot(n, f_n,'rx')
plt.show()
Vous devez obtenir un graphique avec la même allure.
On observe que pour des grandes tailles d’échantillon, la fréquence observée fluctue mais est
proche de la valeur 0,5 qui est la probabilité d’obtenir « Face ».
C’est un résultat très important que l’on appelle « la loi des grands nombres » (que vous
démontrerez bien plus tard). Soit une épreuve de Bernoulli avec une probabilité de succès p .
Lorsque la taille de l’échantillon est suffisamment grande, la fréquence observée du « succès » se
stabilise autour de la probabilité p du succès.
C’est ce qui permet d’estimer une probabilité à partir de simulation.
Nous allons simuler N échantillons de taille n et calculer la proportion de cas où la distance entre
1 1
p et f est inférieur à , c’est à dire où | f − p |≤ .
n n
a) Que réalise la fonction distance définie ci-dessous ?
def distance(n,f):
from math import sqrt
p = 0.5
if abs( f - p) <= 1/sqrt(n):
compteur_d = 1
else:
compteur_d = 0
return compteur_d
b) Que réalise la fonction proportion définie ci-dessous ?
def proportion(n, N):
compteur = 0
for i in range(1, N+1):
f = frequence(n)
compteur = compteur + distance(n,f)
prop = compteur/N
return prop
c) On prend n = 100 et N = 200 . Exécuter la fonction proportion.
Quelle est la proportion obtenue ?
d) Dans la console Python, exécuter plusieurs fois la fonction proportion pour les mêmes valeurs
de n et N . Qu’observez-vous ?
Solution
a) La fonction distance prend en argument n la taille d’un échantillon et f la fréquence de « Face »
de cet échantillon, elle retourne 1 si la distance | f − p | entre la fréquence et la probabilité d’obtenir
1
« Face » ( p = 0,5 ) est inférieure à , et elle retourne 0 sinon.
n
b) La fonction proportion prend en argument n la taille des échantillons et N le nombre
d’échantillons que l’on simule. Elle simule N échantillons de taille n . Pour chaque échantillon,
elle calcule la fréquence f de « Face ». Elle compte la proportion d’échantillons parmi les N qui
1
ont une fréquence f telle que la distance à p soit inférieure ou égale à .
n
c) Une première exécution donne une proportion de 0,965 soit 96,5 %.
Instruction Description
random() Retourne un nombre « aléatoire » r de l’intervalle [0;1] celui-ci étant
muni d’une loi uniforme : quelque soit N le nombre de subdivisions en
sous-intervalles égaux de [0;1] , la probabilité du nombre r d’appartenir à
1
l’un de ces N sous intervalles est la même et est donc égale à .
N