Skip to article frontmatterSkip to article content
import numpy as np

on veut énumérer les 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é à 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 (comme sides) faces.

s = 6
# 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}

n=2

calculer le tableau pour n=2 avec 6 faces

# votre code ici

n=3

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 peux simplement ajouter 3 tableaux, de formes respectivement:

et de par les règles du broadcasting on va obtenir une somme de forme (s, s, s)

# votre code ici

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 !); c’est le propos de la deuxième version

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.

# votre code

def dice(*args):
    pass
# pour tester votre code - devrait être True

(
    dice(7, 2, 6) == 6
and dice(10, 3, 6) == 27
and dice(13, 4, 6) == 140
)
False