Devine le nombre (boucles & random) Tuto

Devine le nombre (boucles & random)

Durée estimée
5 minutes
Votre progression

Créez un compte gratuit pour suivre votre avancement et reprendre où vous avez laissé.

Créer un compte

Boucles, 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é !')
        break

Complè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 de range !), random(), choice(liste).
  • random.seed(n) fixe la graine pour des tirages reproductibles.
  • break sort d'une boucle, continue passe au tour suivant, et la clause else d'une boucle s'exécute si on n'est pas sorti par break.
  • L'idiome while True: ... break est 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.