Skip to article frontmatterSkip to article content
import numpy as np

résultats du tirage de n dès à s faces

Deux versions pour cet exercice:

version pour les débutants

On veut calculer les résultats des tirages de n dés à s faces. Afin, par exemple de faire des probabilités d’obtention de certains tirages. De combien de manières différentes peut-on obtenir 7 avec 3 dès à 6 faces.

Si nous prenons un seul dès à 6 faces. Quels sont les tirages possibles ?

oui 1, 2, 3, 4, 5, 6

Construisez alors un numpy.ndarray contenant les tirages d’un dès à s faces.

# votre code ici

Maintenant si on prend n=2 dès à s=6 faces. Quels sont les tirages possibles ?

Oui:

+123456
1234567
2345678
3456789
45678910
567891011
6789101112

Construisez alors un numpy.ndarray contenant les tirages de n=2 dès à s=6 faces. Un indice ? Utilisez le broadcasting:

On vous fait un rappel. Si on ajoute en numpy un tableau de forme (3,) à un tableau de forme (3, 1) on obtient la matrice suivante:

(a1a2a3)+(b1b2b3)=(a1+b1a2+b1a3+b1a1+b2a2+b2a3+b2a1+b3a2+b3a3+b3a1+b4a2+b4a3+b4)\begin{pmatrix} a_{1} & a_{2} & a_{3} \end{pmatrix} + \begin{pmatrix} b_1 \\ b_2 \\ b_3 \end{pmatrix} = \begin{pmatrix} a_{1} + b_1 & a_{2} + b_1 & a_{3} + b_1 \\ a_{1} + b_2 & a_{2} + b_2 & a_{3} + b_2 \\ a_{1} + b_3 & a_{2} + b_3 & a_{3} + b_3\\ a_{1} + b_4 & a_{2} + b_4 & a_{3} + b_4 \end{pmatrix}
# votre code ici

On remarque que la dimension de notre tableau est le nombre de dès.

On continue.

Maintenant si je prends 3 dès avec 6 faces, je suis en dimension 3 et je veux donc obtenir un cube (avec tous les résultats). Pour obtenir ce cube, je pars de ma matrice (de forme (s, s)) des tirages en dimension 2 et j’utilise le broadcast pour lui ajouter une troisième dimension.

Quelle est la forme de ce vecteur ? Il doit déclencher le broadcast donc il doit être de forme (s, 1, 1).

En effet
(i) la forme (s, ) c’est la forme des lignes de la matrice
(ii) la forme (s, 1) est celle des colonnes
(iii) la forme (1, ..., 1, s) se broadcast en ligne comme (1, s) ou (s,) (essayez) (iv) la forme (s, 1, 1) forcera le broadcast en un cube

Vous avez maintenant tous les indices pour généraliser en dimension n dès (vous aurez naturellement une boucle mais bien sûr pas sur les éléments d’un numpy.ndarray !)

# votre code ici

Cet espace des tirages pourra nous resservir dans de futurs exercices.

Vous remarquez qu’on est dans une manière de faire qui explicite l’ensemble des solutions ce qu’on appelle une méthode en force brute. Ces méthodes sont clairement exponentielles.

les dès version pour les forts

On étudie les probabilités d’obtenir une certaine somme avec plusieurs dés.

Tout le monde connaît le cas classique avec deux dés à 6 faces, ou l’on construit mentalement la grille de 6 sur 6 qui liste les tirages possibles - voir ci-dessus

Imaginons que vous êtes un étudiant, vous venez de faire un exercice de maths qui vous a mené à une formule qui permet de calculer, pour un jeu à nb_dice dés, chacun à sides faces, le nombre de tirages qui donnent une certaine somme target.

Vous voulez vérifier votre formule, en appliquant une méthode de force brute. C’est-à-dire constuire un hypercube avec toutes les possibilités de tirage, puis calculer pour chaque point dans l’hypercube la somme correspondante; de cette façon on pourra compter les occurrences de target.

C’est l’objet de cet exercice. Vous devez écrire une fonction dice qui prend en paramètres:

On convient que par défaut nb_dice=2 et sides=6, qui correspond au cas habituel.

Dans ce cas-là par exemple, on voit, en comptant la longueur des diagonales sur la figure, que dice(7) doit valoir 6, puisque le tableau comporte 6 cases contenant 7 sur la diagonale.

À nouveau, on demande explicitement ici un parcours de type force brute; c’est-à-dire de créer sous la forme d’un tableau numpy, un hypercube qui énumère toutes les combinaisons possibles; et sans faire de for sur les éléments d’un tableau.

Indice

Il existe en numpy une astuce pour augmenter la dimension d’un tableau, ça s’appelle np.newaxis, et ça s’utilise comme ceci

dice_1 = np.arange(1, 7)
dice_2 = dice_1[:, np.newaxis]
dice_1
array([1, 2, 3, 4, 5, 6])
dice_2
array([[1], [2], [3], [4], [5], [6]])

et remarquez que pour créer le tableau ci-dessus il suffit de faire

dice_1 + dice_2
array([[ 2, 3, 4, 5, 6, 7], [ 3, 4, 5, 6, 7, 8], [ 4, 5, 6, 7, 8, 9], [ 5, 6, 7, 8, 9, 10], [ 6, 7, 8, 9, 10, 11], [ 7, 8, 9, 10, 11, 12]])

also available here (requires a login):

https://nbhosting.inria.fr/auditor/notebook/python-mooc:exos/w7/w7-s05-x4-dice