Adloun

Le tableau des effectifs

Exercice de TD · niveau 3 (difficile) · sciences numériques et technologie (seconde), chapitre 6 — Listes et simulations aléatoires · Manipuler une liste

Énoncé

On dispose d'une liste de résultats de lancers de dé, par exemple L = [3, 6, 1, 4, 4, 2, 6, 5, 1, 3, 4, 2].

  1. Écrire une fonction effectifs(L) qui renvoie une liste de six nombres : le nombre de , de , …, de .
  2. Vérifier que la somme des effectifs vaut len(L).
  3. En déduire une fonction frequences(L).

Corrigé

1.

def effectifs(L):
    e = [0, 0, 0, 0, 0, 0]      # six compteurs, un par face
    for x in L:
        e[x - 1] = e[x - 1] + 1  # la face x est comptée à l'indice x-1
    return e

L = [3, 6, 1, 4, 4, 2, 6, 5, 1, 3, 4, 2]
print(effectifs(L))   # [2, 2, 2, 3, 1, 2]

Le décalage x - 1 est le cœur de l'exercice. Les faces vont de à , les indices de à : la face se compte à l'indice . Écrire e[x] provoquerait une IndexError dès qu'un apparaît.

2.

print(sum(effectifs(L)), len(L))   # 12 12

L'égalité est une vérification utile : chaque lancer est compté une fois et une seule. Si les deux nombres diffèrent, c'est qu'un cas a été oublié ou compté deux fois.

3.

def frequences(L):
    return [e / len(L) for e in effectifs(L)]

ou, sans écriture condensée :

def frequences(L):
    f = []
    for e in effectifs(L):
        f.append(e / len(L))
    return f

L'intérêt du tableau d'effectifs est qu'il ne parcourt les données qu'une seule fois pour répondre à six questions à la fois, là où six appels à count parcourraient la liste six fois.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.