Devine un nombre

L'ordinateur choisit un nombre, l'humain devine

L'ordinateur "choisit" un nombre entier "au hasard" entre 1 et 1000.

Vous devez deviner ce nombre en faisant le moins de propositions possibles et pour chaque proposition faite l'ordinateur vous "dit" si votre proposition est, plus petite ou plus grande que le nombre du départ

Voici un algorithme possible

 
 nombre_inconnu <- entier_aléatoire(1,1000)
 proposition    <- entrer("Entrez un nombre entier entre 1 et 1000")
 Tant que proposition est différent du nombre_inconnu
 début
     si proposition < nombre_inconnu 
        afficher("Votre nombre est plus petit que celui de l'ordinateur")
     sinon si proposition > nombre_inconnu
        afficher("Votre nombre est plus grand que celui de l'ordinateur")
     findesi
     proposition    <- entrer("Entrez un nombre entier entre 1 et 1000")
 fin
 afficher("Bravo, Vous avez trouvé le nombre : ",nombre_inconnu)
          
 
 

Traduire en python l'algorithme ci-dessus :

 
from random import *

nombre_inconnu = randint(1,1000)
proposition    = int(input("Entrez un nombre entier entre 1 et 1000 -> "))
while proposition != nombre_inconnu:

    .........
    
print("Bravo, Vous avez trouvé le nombre : ",nombre_inconnu)
 
 

Exercices

  1. Tester le programme
  2. Introduire une variable nb_essais qui compte le nombre de propositions effectuées. Modifier l'affichage de fin de programme pour afficher le contenu de la variable nb_essais
  3. Limiter le nombre d'essais à 10 (Pourquoi 10 ?) l'utilisateur ne doit faire que 10 essais (pas un de plus) pour cela remplacer l'expression proposition != nombre_inconnu par une expression composée avec and ( on peut aussi utiliser for ....)

L'humain choisit un nombre, l'ordinateur devine

Maintenant on échange les rôles

Comment aider l'ordinateur avec un algorithme pour que ce dernier réussisse à trouver le nombre choisit par l'humain ?

L'ordinateur va mémoriser un intervalle de possibilités [choix_min; choix_max] au début cet intervalle est [1;1000], puis en fonction de la réponse faite par l'humain on va diviser par deux la taille de cet intervalle (dichotomie)

La taille de l'intervalle diminuant on finira par "tomber" sur la bonne valeur

On convient que si la proposition de l'ordinateur est plus petite que le nombre choisi par l'humain, ce dernier doit entrer -1, à l'inverse si la proposition de l'ordinateur est plus grande que le nombre choisi par l'humain, ce dernier doit entrer 1, et en cas d'égalité il doit entrer 0

Voici un algorithme possible

 
choix_min <- 0
choix_max <- 1000
proposition_ordinateur    <- (choix_min + choix_max)//2
Tant que Vrai :
    afficher("je propose ", proposition_ordinateur)
    afficher(" Si ma proposition est plus petite que votre nombre entrez -1")
    afficher(" Si ma proposition est plus grande que votre nombre entrez 1")
    afficher(" Si ma proposition est égale à votre nombre entrez 0")
    reponse_humain = entrer(" ---> ")
    si reponse_humain = -1:
        choix_min <- proposition_ordinateur
        proposition_ordinateur    <- (choix_min + choix_max)//2
        
    sinon si reponse_humain = 1:
        choix_max <- proposition_ordinateur
        proposition_ordinateur    <- (choix_min + choix_max)//2
    sinon:
        sortir de la boucle
print("Trouvé !")    
          
 
 

Commentaires:

  1. Nous avons utilisé une boucle "infinie" Tant que Vrai, qui à priori ne se termine jamais, mais ce type de boucle peut être "cassé" par une instruction de sortie de boucle
  2. Pour diviser la taille de l'intervalle par deux on réutilise la formule de la moyenne avec la division euclidienne // pour obtenir une valeur entière

On traduit en python le jeu "Devine un nombre" deuxième version par

 
from random import *

choix_min = 0
choix_max = 1000
proposition_ordinateur    = (choix_min + choix_max)//2
while True :
    print("je propose ", proposition_ordinateur)
    print(" Si ma proposition est plus petite que votre nombre entrez -1")
    print(" Si ma proposition est plus grande que votre nombre entrez 1")
    print(" Si ma proposition est égale à votre nombre entrez 0")
    reponse_humain = int(input(" ---> "))
    if reponse_humain == -1:
        choix_min = proposition_ordinateur
        proposition_ordinateur    = (choix_min + choix_max)//2
        
    elif reponse_humain == 1:
        choix_max = proposition_ordinateur
        proposition_ordinateur    = (choix_min + choix_max)//2
    else:
        break
print("Trouvé !")    
 
 

Exercices

  1. Transformer la boucle while True en une boucle while "normale"