Suite de l'introduction au langage Python (Activité2)

Cette deuxième activité fait appel à des notions et instructions vues dans l’activité 1. Prenez bien le temps de les mémoriser. Retour à l'activite 1

Objectif de l’activité 2 : A l’occasion, de la création de la simulation d’un jeu de dés et l’étude statistique des résultats, on introduit le module random, le type d’une variable, les variables de type liste, la manipulation des listes, les compteurs. On consolide la création des fonctions Python, l’utilisation des structures conditionnelles (if … else :…), des structures répétitives bornées (for) et des structures répétitives non bornées (while).

Partie A : Module random et création de la simulation d’un lancer de dé

Dans ce qui suit nous aurons besoin du module random de Python dont voici une liste non exhaustive de fonctions. Vérifiez que vous comprenez bien toutes ces instructions en les copiant dans un script Python. Elles sont à mémoriser pour la suite.

from random import*

nb=random()                  #  random() génère un nombre pseudo-aléatoire entre 0 et 1 (0 et 1 exclus)
print(nb)                    # affichage de la valeur de nb dans la console
print(type(nb))              # permet de connaître le type de la variable nb
tab=[0,1,2,3,4,5,6,7,8,9]    # tab est une liste d'entiers
print(type(tab))             # permet de connaître le type de la variable tab
shuffle(tab)                 # shuffle est une fonction du module random. Elle mélange les valeurs de la liste tab
print(tab)                   # on affiche la nouvelle liste tab dans la console

Davantage d’informations sur le module random ici

Dans ce qui suit, on souhaite créer la simulation d’un lancer de dé non truqué à 6 faces. Pour cela, on va générer de manière aléatoire les entiers 1, 2, 3, 4, 5, 6.

Partie B : Parions sur 6 !

Dans ce qui suit, on souhaite créer le jeu où on lance une fois un dé et où on gagne si on obtient 6.

A faire : Créer la fonction jeu0() qui ne prend pas de paramètre et qui renvoie True si le dé tombe sur 6 et False sinon.

Remarque : la fonction jeu0() aurait pu renvoyer la chaîne de caractères "Gagné !" si le dé tombe sur 6 et la chaîne de caractères "Perdu !" sinon. Testez, dans les deux cas, à l’aide de la fonction type(…) le type de la variable obtenue.

A faire : Observez attentivement les instructions suivantes. Elles s’intéressent au type d’une variable. On remarquera tout particulièrement l’utilité de la fonction int(…). Vérifiez que vous comprenez bien toutes ces instructions en les copiant dans un script Python. Elles sont à mémoriser pour la suite.

a=5
print(type(a))
b=20/3
print(b, "est est une variable de type : ",type(b))
c=20//3
print(c, "est est une variable de type : ",type(c))
d=20%3
print(d, "est est une variable de type : ",type(d))
e=False
print(e, "est est une variable de type : ",type(e))
f='Bonjour !'
print(f, "est est une variable de type : ",type(f))
g='1789'
print(g, "est est une variable de type : ",type(g))
h=int(g)
print(h, "est est une variable de type : ",type(h))
t=[44,49,53,72,85]
print(t, "est est une variable de type : ",type(t))

Partie C : Combien de fois faut-il lancer le dé pour obtenir 6 ?

Dans ce qui suit, on souhaite créer le jeu dont le nombre de points est le nombre de lancers nécessaires pour obtenir 6.

Indications :on pourra se servir des instructions suivantes qui permettent de saisir au clavier une valeur et de l’affecter à une variable (de type string). L’affichage de la console obtenu par la dernière instruction est-il cohérent ? Comment modifier ces lignes de manière à obtenir le résultat attendu ? (On pourra utiliser une des instructions rencontrées dans la partie B)

a=input("Saisir une valeur entière")
print(a)
print(type(a))
b=input("Saisir une valeur entière")
print(b)
print(type(b))
print('La somme est égale à :',a+b)     # Cet affichage est-il cohérent ?
                                        # Si ce n'est pas le cas faites les modifications
                                        # nécessaires et appelez le professeur.

Partie D : Fonction qui renvoie plusieurs variables

Dans ce qui suit, on fait encore évoluer le jeu en limitant le nombre de lancers de dé à 4. Ainsi, on gagne si on obtient la face, saisie au clavier, avant 4 lancers de dé.

Indications :On s’inspirera de la fonction suivante qui renvoie un triplet (3-upplet) contenant le cosinus, le sinus et la tangente d’un angle dont on donne respectivement le côté adjacent, le côté opposé et l’hypoténuse.

def trigo(adj,opp,hyp):   # la fonction prend trois paramètres
    cos=adj/hyp
    sin=opp/hyp
    tan=opp/adj
    return cos,sin,tan    # elle renvoie un triplet (3-upplet)

a=3                 # valeur du côté adjacent
o=4                 # valeur du côté opposé
h=5                 # valeur de l'hypothénuse
t=trigo(a,o,h)      # t prend la valeur renvoyée par la fonction. Il s'agit d'un triplet (un 3 upplet)
print(t)
print("Le cosinus de l'angle est :",t[0])   # t[0] permet d'obtenir la première valeur du 3 upplet
print("Le sinus de l'angle est :",t[1])     # t[1] permet d'obtenir la deuxième valeur du 3 upplet
print("La tangente de l'angle est :",t[2])  # t[2] permet d'obtenir la troisième valeur du 3 upplet

Partie E : Le chiffre des unités du produit des faces de deux dés

On souhaite maintenant simuler le jeu qui consiste à lancer deux dés cubiques à 6 faces et dont le nombre de points est égal au chiffre des unités du produit des faces.

Exemple :Le dé1 tombe sur 5. Le dé2 tombe sur 6. Le produit des faces est 30. Le chiffre des unités est 0. Le nombre de point obtenu est 0.

Calcul du nombre de points :

Créez la fonction jeu3() qui ne prend pas de paramètre et qui renvoie le nombre de points obtenus après le lancer des deux dés.

Indications :on rappelle les instructions suivantes. Vous les avez déjà rencontrées dans la Partie B.

a/b            # a/b est le résultat de la division de a par b
a//b           # a//b est le quotient de la division euclidienne de a par b
a%b            # a%b est le reste de la division euclidienne de a par b

Création de la liste des résultats

Utilisez la fonction précédente pour créer la fonction listeLancers qui prend en paramètre un entier n correspondant au nombre de lancers des deux dés souhaités et qui renvoie la liste des résultats obtenus c’est à dire des points obtenus à chaque lancers.

Indications :

L=[]           # Création d’une liste vide nommé ici L
L.append(1)    # Ajout d’une valeur dans la liste L
L.append(3)    # Ajout d’une deuxième valeur dans une L
L.append(5)    # Ajout d’une troisième valeur dans une L

n=len(L)       # On calcule la longueur de L et on l'affecte à n

u=L[0]         # Première valeur de L (valeur d'indice 0)
v=L[n-1]       # Dernière valeur de L (valeur d'indice n-1)

# Parcours d’un tableau Méthode 1 :
print("Méthode1")
for i in range(n):  # i prend les valeurs {0 ; 1 ; ... ; n-1}
    print(L[i])

# Parcours d’un tableau Méthode 2 :
print("Méthode2")
for element in L:
    print(element)

Création de la fonction moyenne

Créez la fonction moyenne(tab) qui prend en paramètre tab, une liste d’entiers, et qui renvoie la moyenne des valeurs contenues dans la liste.

Recherche du nombre de zéro dans une liste

Créez la fonction compterZero(tab) qui prend en paramètre tab une liste d’entiers et qui renvoie le nombre de zéro contenu dans cette liste.
En vous inspirant du code de la fonction précédente, créez la fonction compter(tab,res) qui prend en paramètre tab une liste d’entiers naturels et res un entier naturel et qui renvoie le nombre d’occurrences de l’entier res dans cette liste.

Tableau des effectifs

En utilisant la fonction compter(tab,res), créez la fonction effectif(tab) qui prend en paramètre tab, une liste d’entiers inférieurs ou égaux à 9 et qui renvoie la liste tabEffectif, de longueur 10, contenant les différentes occurrences des entiers de 0 à 9 dans la liste tab.

Exemple : On joue à ce jeu 10 fois de suite. On obtient la liste des points :[5, 6, 5, 8, 8, 6, 2, 0, 8, 2].
Le tableau des effectifs est alors : tabEffectif=[1, 0, 2, 0, 0, 2, 2, 0, 3, 0]. En effet,
0 apparaît 1 fois dans tab donc tabEffectif[0]=1
1 n’est pas dans tab donc tabEffectif[1]=0
8 apparaît 3 fois dans tab donc tabEffectif[8]=3

Une deuxième version pour ceux qui ont le temps

On souhaite créer une deuxième version de la fonction effectif(tab). On l’appellera effectif2(tab). Dans cette nouvelle version on ne souhaite plus utiliser la fonction compter(tab,res).
Pour cela, on crée une liste vide tabEffectif contenant 10 fois la valeur 0.
On balaie la liste tab à l'aide d'une struture répétitive bornée.
Pour chaque valeur tab[i] de tab, on incrémente dans la liste tabEffectif, la valeur dont l’indice est égale à tab[i].

Exemple : Si tab=[5, 6, 5, 8, 8, 6, 2, 0, 8, 2]
Initialement, on a : tabEffectif=[0,0,0,0,0,0,0,0,0,0]
tab[0]=5 donc tabEffectif devient égal à [0,0,0,0,0,1,0,0,0,0]
tab[1]=6 donc tabEffectif devient égal à [0,0,0,0,0,1,1,0,0,0]
etc….

Calcul des fréquences

Créez la fonction fréquence(tab) qui prend en paramètre le tableau tab généré par la fonction listeLancers et qui renvoie la fréquence des occurrences des entiers inférieurs ou égaux à 9 dans le tableau tab.

Exemple : Si tab=[5, 6, 5, 8, 8, 6, 2, 0, 8, 2], alors la fonction fréquence renvoie le tableau :
[0.1, 0.0, 0.2, 0.0, 0.0, 0.2, 0.2, 0.0, 0.3, 0.0]
En effet, on a vu que la fonction effectif renvoie [1, 0, 2, 0, 0, 2, 2, 0, 3, 0]

Analyse des résultats et explications :

On souhaite analyser les résultats obtenus par cette simulation.

    1. Avant de lancer les deux dés, si vous deviez parier sur un chiffre, quel chiffre vous ne devriez surtout pas choisir ? Pourquoi ?
    2. Si vous deviez parier sur un chiffre, quel(s) chiffre(s) choisiriez vous ? Pourquoi ?
  1. On s’intéresse aux valeurs obtenues dans la liste tabFrequence.
    1. On choisit une valeur de n. Comment se comportent les valeurs de la liste tabFrequence pour différentes séries de n lancers ?
    2. Lorsqu’on fait croître les valeurs de n, comment se comportent les valeurs de la liste tabFrequence ?
  2. Pour une très grande valeur de n, comment peut-on expliquer les résultats obtenus dans le tableau tabFrequence ?
  3. Pour une très grande valeur de n, comment peut-on expliquer les résultats obtenus pour la moyenne  ?