Générer des exercices aléatoires

Générer des exercices aléatoires#

Il est souvent ludique d’utiliser le module random de Python avec les élèves car il permet d’écrire des programmes aux résultats imprévus. Nous autres, enseignants, nous pouvons aussi l’utiliser pour générer aléatoirement des exercices mais ce n’est pas vraiment satisfaisants. En effet, si l’élève recharge son activité, l’exercice sera différent et il sera difficile de lui apporter une correction individualisée.

Le module capytale.random permet de contourner ceci. Sa méthode user_seed permet de générer une graine propre à chaque utilisateur. Il faut alors fournir cette graine au module random de Python pour profiter de la magie :

from capytale.random import user_seed
import random

random.seed(a=user_seed())

# donnera toujours le même nombre pour cet utilisateur,
# même dans une autre activité !
random.randint(0, 99)

Pour une documentation détaillée du module random de Capytale, consulter cette section.

Un exemple d’activité#

Note

L’activité présentée ici n’est probablement pas réaliste mais sa simplicité permet d’insiter sur la technique mise en œuvre.

Ainsi, on peut proposer le notebook ci-dessous aux élèves.


Exercice : Validez la cellule ci-dessous pour afficher la consigne de l’exercice.

from _exercices import *

consigne_exercice1()

Exercice : dans la cellule ci-dessous, implémenter en Python la fonction \(f\) définie par \(f(x) = -3x + 7\).

def f(x):
    ...

Dans lequel le contenu du module _exercices.py pourrait être celui-ci :

# contenu de _exercices.py
import random
from capytale.random import user_seed
from IPython.display import Markdown


def consigne_exercice1():
    random.seed(a=user_seed())
    a = random.randint(-15, -2)
    b = random.randint(1, 15)
    return Markdown(f"> **Exercice :** dans la cellule ci-dessous, "
        "implémenter en Python la fonction $f$ définie par $f(x) = {a}x + {b}$.")

Correction de l’activité#

Dans une autre activité, on pourra proposer la correction de cet exercice, par exemple comme ceci.


Exercice : Validez la cellule ci-dessous pour afficher la correction de l’exercice.

from _exercices import *

correction_exercice1()

Il fallait implémenter en Python la fonction \(f\) définie par \(f(x) = -3x + 7\). On peut faire comme ceci :

def f(x):
    return -3 * x + 7

# contenu de _exercices.py
import random
from capytale.random import user_seed
from IPython.display import Markdown


def correction_exercice1():
    # l'initialisation puis les appels au générateur aléatoire
    # exactements identiques garantissent que les mêmes valeurs
    # sont générées
    random.seed(a=user_seed())
    a = random.randint(-15, -2)
    b = random.randint(1, 15)
    return Markdown(f"""\
> Il fallait implémenter en Python la fonction $f$ définie par $f(x) = {a}x + {b}$.
> On peut faire comme ceci :

```python
def f(x):
    return {a} * x + {b}
```
""")

Ainsi, même si les activités sont différentes, les élèves retrouverons la correction correspondant à leur exercice.

Tip

Il peut être intéressant de combiner cette fonctionnalité avec celle de l’auto-évaluation afin de proposer à l’élève une expérience unique et autonome.

Hint

La méthode user_module tient compte du mode de consultation de l’activité. En effet, si c’est l’enseignant qui consulte l’activité de l’élève, la graine retournée sera celle de l’élève.