Devine le nombre (boucles & random)
Créez un compte gratuit pour suivre votre avancement et reprendre où vous avez laissé.
Créer un compteBoucles, hasard, et un mini-jeu pour finir
Tes programmes savent maintenant prendre des décisions. Il leur manque encore quelque chose d'essentiel : la capacité de répéter des actions sans que tu écrives la même ligne dix fois. Et tant qu'à faire, on va aussi leur apprendre à lancer des dés : sans hasard, pas de jeu, pas de simulation, pas de cryptographie.
À la fin de cette fiche, tu sauras répéter du code avec while (tant que…) et for (un nombre fixé de fois), parcourir une plage de nombres avec range, tirer des valeurs aléatoires avec le module random, et tu coderas un mini-jeu « Devine le nombre » qui assemble tout ça.
Remarque
Comment lire cette fiche. Tu vas rencontrer deux types d'exercices à la suite des explications :
- Complète le programme — 1 ou 2 mots à compléter, juste après chaque nouveau concept.
- À toi de jouer — un petit programme à finir, en fin de section.
Chaque cellule s'exécute en cliquant sur Exécuter. En cas d'erreur, lis le message rouge : il indique la ligne fautive et le type d'erreur.
Répéter avec while : tant que la condition est vraie
La boucle while (« tant que » en anglais) répète un bloc de code aussi longtemps qu'une condition reste vraie. La syntaxe ressemble à celle du if : deux-points en fin de ligne, et le bloc à répéter est indenté de 4 espaces.
Lis le code à voix haute : « tant que n est inférieur ou égal à 5, affiche n et augmente-le de 1 ». Quand n vaut 6, la condition devient fausse et Python sort de la boucle.
Complète le programme
Affiche les nombres de 1 à 10. Complète la condition d'arrêt :
Complète le programme
Compte à rebours de 5 jusqu'à 1, puis affiche « Décollage ! ». Complète la mise à jour du compteur :
Voir la solution
n = 5
while n >= 1:
print(n)
n = n - 1
print('Décollage !')À toi de jouer
Calcule la somme 1 + 2 + 3 + … + 100 avec une boucle while. Affiche le résultat (tu devrais trouver 5050).
Remarque
Spécificité Python — l'indentation fait foi. Le bloc répété par le while est délimité uniquement par l'indentation, pas par des accolades comme en C ou en Java. Si tu oublies d'indenter, Python lève une IndentationError avant même d'exécuter. Et si tu oublies de mettre à jour la variable de la condition (ici n = n + 1), tu obtiens une boucle infinie — dans le navigateur, l'onglet finit par se figer. Vérifie toujours que quelque chose dans la boucle rapproche la condition de False.
Répéter un nombre de fois avec for et range
Quand on sait à l'avance combien de fois on veut répéter, la boucle for est plus pratique que while. Couplée à range, elle permet de générer une suite de nombres entiers :
range(5) produit les entiers de 0 à 4 (5 valeurs en partant de 0). Le compteur i prend successivement chacune de ces valeurs. Trois variantes utiles :
| Appel | Valeurs produites |
|---|---|
range(5) |
0, 1, 2, 3, 4 |
range(1, 6) |
1, 2, 3, 4, 5 |
range(0, 10, 2) |
0, 2, 4, 6, 8 |
range(10, 0, -1) |
10, 9, 8, …, 1 |
Complète le programme
Affiche les entiers de 1 à 10 inclus. Complète l'appel à range :
Voir la solution
for n in range(1, 11):
print(n)Complète le programme
Affiche la table de multiplication par 7. Complète :
Voir la solution
for k in range(1, 11):
print('7 ×', k, '=', 7 * k)À toi de jouer
Calcule la somme des carrés des entiers de 1 à 10, c'est-à-dire $1^2 + 2^2 + \ldots + 10^2$. Affiche le résultat (tu devrais trouver 385).
Voir la solution
total = 0
for n in range(1, 11):
total = total + n ** 2
print(total)Remarque
Spécificité Python — la borne haute est exclue. range(1, 11) produit les nombres jusqu'à 10, pas jusqu'à 11. Cette convention « bornes [start, stop[ » est partagée par presque toute la bibliothèque Python (slicing de listes, list[a:b]…). Elle déroute au début, mais elle a un avantage : range(0, n) produit exactement n valeurs, ce qui rend les calculs de taille très simples.
Le hasard avec le module random
Pour fabriquer du hasard en Python, on importe le module random, qui fait partie de la bibliothèque standard. Trois fonctions vont te suffire pour 90 % des situations :
| Fonction | Renvoie |
|---|---|
random.randint(a, b) |
un entier au hasard entre a et b inclus |
random.random() |
un flottant au hasard dans $[0\,;1[$ |
random.choice(liste) |
un élément tiré au hasard dans la liste |
Relance la cellule plusieurs fois : les résultats changent à chaque exécution. Attention au piège classique :
Complète le programme
Tire un entier au hasard entre 1 et 100 inclus, puis affiche-le :
Voir la solution
import random
print(random.randint(1, 100))Complète le programme
Choisis aléatoirement un menu du jour parmi trois plats. Complète :
Voir la solution
import random
plats = ['pâtes', 'pizza', 'salade']
print('Menu du jour :', random.choice(plats))À toi de jouer
Simule 1000 lancers d'un dé à 6 faces et compte combien de fois le 6 est sorti. La fréquence devrait être proche de $\dfrac{1}{6} \approx 0{,}167$.
Voir la solution
import random
nb_six = 0
for _ in range(1000):
if random.randint(1, 6) == 6:
nb_six = nb_six + 1
print('Six obtenus :', nb_six)
print('Fréquence :', nb_six / 1000)Remarque
Spécificité Python — pseudo-hasard et reproductibilité. Le hasard de random n'est pas vraiment aléatoire : c'est un pseudo-hasard, calculé à partir d'une graine (seed). Si tu fixes la graine avec random.seed(42) avant tes tirages, tu obtiens exactement la même séquence à chaque exécution. C'est très utile pour reproduire un bug, ou pour rendre une simulation testable. Pour un vrai hasard cryptographique, on utilisera plutôt le module secrets (hors programme lycée).
Mini-jeu : Devine le nombre
On y est. Le programme tire un nombre mystère entre 1 et 100, et un « joueur » (qu'on simule avec une liste de propositions, faute de pouvoir saisir au clavier dans le navigateur) tente de le trouver. À chaque essai, on affiche plus grand, plus petit ou gagné.
Trois choses à observer : (1) la liste propositions suit la stratégie de la dichotomie (on coupe l'intervalle en deux à chaque essai), (2) break sort immédiatement de la boucle dès qu'on a trouvé, (3) avec une graine fixée tu peux rejouer la même partie pour mettre au point ta stratégie.
Complète le programme
Modifie le code ci-dessous pour que le nombre mystère soit tiré entre 1 et 50 (au lieu de 1 et 100). Ajuste l'appel à randint :
Voir la solution
import random
random.seed(3)
mystere = random.randint(1, 50)
for essai in [25, 12, 18, 15, 16]:
if essai < mystere:
print(essai, '→ plus grand')
elif essai > mystere:
print(essai, '→ plus petit')
else:
print(essai, '→ gagné !')
breakComplète le programme
Compte le nombre d'essais qu'il a fallu pour trouver le mystère. Complète l'incrémentation :
Voir la solution
import random
random.seed(7)
mystere = random.randint(1, 100)
propositions = [50, 25, 37, 31, 28, 30, 29]
nb_essais = 0
for essai in propositions:
nb_essais = nb_essais + 1
if essai == mystere:
print('Trouvé en', nb_essais, 'essais.')
breakÀ toi de jouer
Programme un bot dichotomique qui trouve tout seul le nombre mystère entre 1 et 100. À chaque tour, il propose le milieu de l'intervalle [bas, haut], puis il met à jour bas ou haut selon la réponse. La boucle s'arrête quand l'essai est égal au mystère. Affiche en combien de tours le bot a trouvé. (Indice : avec la dichotomie, ça doit converger en au plus 7 tours pour 1-100.)
Remarque
Spécificité Python — while True est idiomatique. Là où en mathématiques on évite les boucles « infinies », en Python on écrit fréquemment while True: pour démarrer une boucle dont la sortie est gérée par un break à l'intérieur. C'est le bon réflexe quand la condition d'arrêt n'est pas calculable d'avance, comme dans le bot dichotomique : on ne sait pas combien de tours il faudra, on s'arrête « quand on a trouvé ». À ne pas confondre avec une boucle infinie oubliée : ici, le break est obligatoire et bien identifiable.
Pour aller plus loin
1. break et continue : maîtriser les sorties de boucle. break sort immédiatement de la boucle. continue, lui, passe au tour suivant sans exécuter la fin du bloc. Pratique pour ignorer certains cas :
2. La clause else sur une boucle. Très peu connue, et pourtant utile : un bloc else attaché à un for ou un while s'exécute si la boucle est allée jusqu'au bout sans rencontrer de break. Idéal pour signaler « rien n'a été trouvé » :
3. L'opérateur walrus := (Python 3.8+). Il permet d'affecter et tester dans la même expression, ce qui évite des duplications. Syntaxe : variable := expression. Comparaison directe avec et sans walrus :
4. Comparaison avec C / Java / JavaScript. Dans ces trois langages, la boucle classique s'écrit for (int i = 0; i < n; i++) { ... } : trois choses à gérer (initialisation, condition, incrément) et un risque d'erreur de bornes (« off-by-one »). En Python, for i in range(n) suffit, et la convention « borne haute exclue » fait disparaître la moitié des bugs de bornes. C'est l'un des choix de design qui rendent Python si lisible.
À toi de jouer
Réécris la boucle « somme des carrés de 1 à 10 » avec la clause else sur le for : si la boucle finit sans break, affiche « calcul terminé proprement ». Utilise break uniquement si la somme partielle dépasse 200 (ce qui n'arrivera pas ici, donc le else doit s'afficher).
Voir la solution
total = 0
for n in range(1, 11):
total = total + n ** 2
if total > 200:
print('Stop : total =', total)
break
else:
print('calcul terminé proprement, total =', total)Ce que tu as appris
while condition:répète tant que la condition reste vraie ; ne pas oublier de mettre à jour la variable testée.for i in range(...)répète un nombre connu de fois ; la borne haute est exclue.range(a, b, pas): trois variantes utiles, dont les pas négatifs pour décompter.- Le module
random:randint(a, b)(bornes incluses, différent derange!),random(),choice(liste). random.seed(n)fixe la graine pour des tirages reproductibles.breaksort d'une boucle,continuepasse au tour suivant, et la clauseelsed'une boucle s'exécute si on n'est pas sorti parbreak.- L'idiome
while True: ... breakest parfaitement légitime quand la condition d'arrêt n'est pas connue d'avance.
Et après…
Tu vas découvrir comment ranger plusieurs valeurs dans une seule variable grâce aux listes : tu pourras alors stocker tous les essais d'une partie, calculer une moyenne sur des notes, ou parcourir une collection d'objets.