Aller au contenu

Un mot pour Fahmio

Tu écris. Tu continues.

Un problème, une idée — assez pour qu’on comprenne, puis tu retournes à ta copie.

On lit. Tu n’as rien d’autre à faire.

Où veux-tu aller ?

↑ ↓ pour parcourir · Entrée pour ouvrir · Échap pour fermer

Fahmio
Fahmio
Bac Tunisie
SD-LStructures de données et modularité

Simulation aléatoire : traduire un intervalle ou un tirage en appel à Aléa, puis l'intégrer à un remplissage ou à un tirage d'indice

Idée directrice

Toute simulation de hasard de l'épreuve se ramène à une question : quel intervalle d'entiers veut-on, bornes comprises ? Avec l'ancienne fonction Aléa(n), qui retourne un entier de 0 à n − 1, un entier de [a, b] s'obtient par a + Aléa(b − a + 1) ; avec la notation Aléa(a, b) du sujet 2026, les deux bornes s'écrivent directement, la plus petite en premier. Une lettre ou un chiffre tiré au hasard passe par son code et Chr ; un élément tiré au hasard dans un tableau passe par un indice aléatoire de 0 à N − 1.

Ce qui aide à reconnaître la démarche

« qui permet de générer automatiquement un nombre aléatoire entre » ; « L'instruction qui permet d'affecter à une variable X une valeur aléatoire de l'intervalle » ; « On se propose de générer aléatoirement un entier » ; « Générer aléatoirement un tableau » ; « au hasard »

Besoin d’un point de départ ? Voir la méthode
  • Écrire l'intervalle voulu [a, b], bornes comprises, et compter ses valeurs : b − a + 1.
  • Notation 2026 : Aléa(a, b) avec a ≤ b. Ancienne notation : a + Aléa(b − a + 1).
  • Lettre majuscule : Chr(Aléa(65, 90)) ; minuscule : Chr(Aléa(97, 122)) ; chiffre sous forme de caractère : Chr(Aléa(48, 57)).
  • Élément au hasard d'un tableau : tirer l'indice par Aléa(0, N − 1), jamais jusqu'à N.
  • Choix parmi k cas (opérateur, face, secteur) : tirer un code de 1 à k, puis le traduire par une structure conditionnelle.
Les pièges à vérifier dans ta démarche

Oublier le « + 1 » avec l'ancienne notation (a + Aléa(b − a) ne tire jamais b) ; écrire Aléa(a + b) ; donner la plus grande borne en premier à Aléa(a, b) ; tirer un indice jusqu'à N au lieu de N − 1 ; affecter le code tiré sans le transformer en caractère par Chr ; appeler deux fois la fonction de tirage là où il faut mémoriser une seule valeur.

Sujet principal

Exercice 1 (5 points) — dans l'esprit des sessions 2016, 2020 et 2026

4 questionsCorrigé masqué

Pour programmer un jeu de société numérique, on dispose de la fonction Aléa(a, b), qui retourne un entier aléatoire compris entre a et b, bornes incluses, avec a ≤ b. Rappel : ASCII("a") = 97 et les 26 lettres minuscules ont des codes consécutifs.

  1. Compléter chacun des traitements suivants par un appel à Aléa.
    1. Pile ou face (pile = 1, face = 0) : le résultat est affecté à P.
    2. Roue de loterie à 8 secteurs numérotés de 1 à 8 : le résultat est affecté à R.
    3. Code secret : un entier positif de 3 chiffres, affecté à C.
    4. Tirage de 5 lettres minuscules, rangées dans un tableau L d'indices 0 à 4.
  2. Un ancien programme utilise la fonction Aléa(n), qui retourne un entier de 0 à n − 1. Valider par V ou F chacune des instructions suivantes, censées affecter à X un entier aléatoire de l'intervalle [5, 20].
    1. X ← 5 + Aléa(15)
    2. X ← 5 + Aléa(16)
    3. X ← Aléa(5 + 20)
    4. X ← 20 - Aléa(16)
  3. Un tableau T de N entiers est rangé dans l'ordre décroissant. On veut tirer un entier E compris entre le plus petit et le plus grand élément de T. Une seule des propositions suivantes est correcte : laquelle ? Justifier.
    1. E ← Aléa(T[0], T[N-1])
    2. E ← Aléa(T[N-1], T[0])
    3. E ← Aléa(T[1], T[N])
  4. Écrire l'algorithme d'une procédure Remplir (@T : TAB, N : Entier) qui remplit T par N entiers aléatoires compris entre 10 et 60, puis la séquence qui tire au hasard un indice k de T et affiche l'élément correspondant. Réécrire les deux appels à Aléa avec l'ancienne notation Aléa(n).
Voir la correction commentéeAprès avoir posé votre démarche

1.a P ← Aléa(0, 1).

1.b R ← Aléa(1, 8).

1.c Idée : un entier positif de 3 chiffres va de 100 à 999. C ← Aléa(100, 999).

1.d Idée : tirer le code, puis le transformer en lettre par Chr ; le code de « z » est 97 + 25 = 122.

Pour i de 0 à 4 Faire
    L[i] ← Chr(Aléa(97, 122))
Fin Pour

2. Idée : l'intervalle [5, 20] contient 20 − 5 + 1 = 16 entiers ; il faut donc Aléa(16), décalé pour démarrer à 5.

  • a. F — Aléa(15) donne 0 à 14, donc X va de 5 à 19 : 20 n'est jamais tiré.
  • b. V — 0 à 15, décalé de 5 : X va de 5 à 20.
  • c. F — Aléa(25) donne 0 à 24.
  • d. V — 20 − 0 = 20 et 20 − 15 = 5 : la même plage [5, 20], parcourue à l'envers.

3. Proposition b. Idée : dans un tableau décroissant, le plus grand élément est T[0] et le plus petit T[N-1] ; Aléa(a, b) attend la plus petite borne en premier. La proposition a donne les bornes dans l'ordre inverse (a > b) ; la proposition c utilise T[N], qui n'existe pas (indices 0 à N − 1), et T[1], qui n'est pas le plus grand élément.

4.

Procédure Remplir (@T : TAB, N : Entier)
DEBUT
    Pour i de 0 à N-1 Faire
        T[i] ← Aléa(10, 60)
    Fin Pour
FIN
k ← Aléa(0, N-1)
Ecrire(T[k])

T.D.O.L de Remplir : i — Entier — compteur. Avec l'ancienne notation, [10, 60] compte 51 valeurs : T[i] ← 10 + Aléa(51) ; et l'indice, de 0 à N − 1, s'écrit k ← Aléa(N).

Changer d’énoncé, garder le raisonnement

Choisis un seul transfert après le sujet principal. Qu’est-ce qui change ? Quel résultat ou quelle méthode peux-tu réutiliser ? Les autres exercices restent disponibles pour une prochaine séance.

Variantes rencontrées : validation V/F de X ← 2 + Aléa(9) pour l'intervalle [2, 10] (principale 2016) ; multiplication par un entier aléatoire de [5, 64] dans le calcul d'un code (principale 2019) ; exercice entier sur pile ou face, dé, entier de 4 chiffres et 7 lettres majuscules (principale 2020) ; opérandes et opérateur tirés au hasard pour un CAPTCHA, puis opération affichée au hasard (principale 2023) ; choix de l'instruction qui tire un entier entre T[0] et T[N-1], et remplissage aléatoire d'un tableau par Aléa(2, 100) (principale 2026).

Exercices d'entraînement — une nuance à la fois

1 Drill SD-L.1 — erreurs de décalage : b − a ou b − a + 1, tirage de pairs et intervalle centré
Entraînement 01 / 04

Drill SD-L.1 — erreurs de décalage : b − a ou b − a + 1, tirage de pairs et intervalle centré

3 questionsCorrigé masqué

On dispose de la fonction Aléa(n), qui retourne un entier aléatoire de 0 à n − 1 (n > 0).

  1. Valider par V ou F chacune des instructions suivantes, censées affecter à X un entier pair aléatoire de l'intervalle [10, 50].
    1. X ← 2 * Aléa(21) + 10
    2. X ← 2 * Aléa(20) + 10
    3. X ← Aléa(41) + 10
    4. X ← 2 * (Aléa(21) + 5)
  2. Valider par V ou F chacune des instructions suivantes, censées affecter à Y un entier aléatoire de l'intervalle [−5, 5].
    1. Y ← Aléa(11) - 5
    2. Y ← Aléa(10) - 5
  3. Avec la fonction Aléa(a, b), qui retourne un entier aléatoire de [a, b], écrire la boucle qui remplit un tableau T de N éléments par des entiers pairs aléatoires de [10, 50].
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : les entiers pairs de [10, 50] sont 10, 12, …, 50, soit (50 − 10) / 2 + 1 = 21 valeurs : on tire un rang de 0 à 20, puis on le transforme.

  • a. V — 2 × 0 + 10 = 10 et 2 × 20 + 10 = 50, avec un pas de 2.
  • b. F — le rang va de 0 à 19 : le plus grand tirage est 2 × 19 + 10 = 48, et 50 n'est jamais obtenu.
  • c. F — X parcourt tous les entiers de 10 à 50, y compris les impairs.
  • d. V — 2 × (0 + 5) = 10 et 2 × (20 + 5) = 50, avec un pas de 2.

2. [−5, 5] contient 5 − (−5) + 1 = 11 entiers. a. V — de 0 − 5 = −5 à 10 − 5 = 5. b. F — de −5 à 9 − 5 = 4 : la borne 5 manque.

3. Idée : la proposition d s'écrit directement avec les bornes du rang, 0 + 5 = 5 et 20 + 5 = 25.

Pour i de 0 à N-1 Faire
    T[i] ← 2 * Aléa(5, 25)
Fin Pour

L'écriture T[i] ← 2 * Aléa(0, 20) + 10 convient aussi.

2 Drill SD-L.2 — caractères tirés au hasard : captcha alternant lettres majuscules et chiffres
Entraînement 02 / 04

Drill SD-L.2 — caractères tirés au hasard : captcha alternant lettres majuscules et chiffres

3 questionsCorrigé masqué

Un formulaire affiche un captcha de 6 caractères : les caractères d'indice pair (0, 2 et 4) sont des lettres majuscules et ceux d'indice impair (1, 3 et 5) sont des chiffres, par exemple "K4R0B7". On dispose de Aléa(a, b), qui retourne un entier aléatoire de [a, b], et de Chr(x), qui retourne le caractère de code ASCII x ; ASCII("A") = 65 et ASCII("0") = 48.

  1. Écrire l'expression qui tire une lettre majuscule, puis celle qui tire un chiffre sous forme de caractère.
  2. Écrire l'algorithme d'une fonction Captcha () : Chaîne qui retourne un captcha de ce format, et dresser son T.D.O.L.
  3. Écrire la séquence qui affiche un captcha, lit la réponse de l'utilisateur et affiche « valide » si elle est identique au captcha, « invalide » sinon.
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : les 26 majuscules ont les codes 65 à 65 + 25 = 90, les 10 chiffres les codes 48 à 48 + 9 = 57. Lettre : Chr(Aléa(65, 90)) ; chiffre : Chr(Aléa(48, 57)), ou Convch(Aléa(0, 9)).

2.

Fonction Captcha () : Chaîne
DEBUT
    ch ← ""
    Pour i de 0 à 5 Faire
        Si i Mod 2 = 0 Alors
            ch ← ch + Chr(Aléa(65, 90))
        Sinon
            ch ← ch + Chr(Aléa(48, 57))
        FinSi
    Fin Pour
    Retourner ch
FIN

T.D.O.L : ch — Chaîne — captcha en construction ; i — Entier — indice du caractère.

3. Idée : le captcha doit être mémorisé avant d'être affiché ; appeler Captcha() une seconde fois pour la comparaison produirait une autre chaîne.

c ← Captcha()
Ecrire(c)
Lire(rep)
Si rep = c Alors
    Ecrire("valide")
Sinon
    Ecrire("invalide")
FinSi
3 Drill SD-L.3 — opérateur tiré au hasard : questions de calcul mental et leurs réponses
Entraînement 03 / 04

Drill SD-L.3 — opérateur tiré au hasard : questions de calcul mental et leurs réponses

4 questionsCorrigé masqué

Une application de calcul mental remplit deux tableaux de même taille N (5 ≤ N ≤ 20) : Q[i] contient une question de la forme "a op b = ?" et R[i] sa réponse. Les opérandes a et b sont des entiers aléatoires de [1, 12] ; l'opérateur est obtenu en tirant un entier de 1 à 3, qui désigne respectivement +, - et x. Exemple : a = 7, code 3 et b = 9 donnent Q[i] = "7 x 9 = ?" et R[i] = 63. On dispose de Aléa(a, b) et de Convch(x).

  1. Écrire l'algorithme d'une procédure Question (@q : Chaîne, @r : Entier) qui construit une question aléatoire et sa réponse, et dresser son T.D.O.L.
  2. Écrire l'algorithme de la procédure Remplir (@Q : TabCh, @R : TabEnt, N : Entier) en faisant appel à Question.
  3. Écrire la séquence qui choisit au hasard une des N questions, l'affiche, lit la réponse de l'utilisateur et affiche « correct » ou « faux ».
  4. Donner la question et la réponse obtenues pour les tirages (a, code, b) = (4, 2, 11), puis (12, 1, 5).
Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : tirer les deux opérandes et un code d'opérateur, puis traduire le code à la fois en symbole et en calcul.

Procédure Question (@q : Chaîne, @r : Entier)
DEBUT
    a ← Aléa(1, 12)
    b ← Aléa(1, 12)
    c ← Aléa(1, 3)
    Si c = 1 Alors
        op ← "+"
        r ← a + b
    Sinon Si c = 2 Alors
        op ← "-"
        r ← a - b
    Sinon
        op ← "x"
        r ← a * b
    FinSi
    q ← Convch(a) + " " + op + " " + Convch(b)
    q ← q + " = ?"
FIN

T.D.O.L : a, b, c — Entier — opérandes et code de l'opérateur ; op — Chaîne — symbole de l'opérateur.

2.

Procédure Remplir (@Q : TabCh, @R : TabEnt,
                   N : Entier)
DEBUT
    Pour i de 0 à N-1 Faire
        Question(Q[i], R[i])
    Fin Pour
FIN

3. Idée : l'indice tiré relie la question à sa réponse dans les deux tableaux.

k ← Aléa(0, N-1)
Ecrire(Q[k])
Lire(rep)
Si rep = R[k] Alors
    Ecrire("correct")
Sinon
    Ecrire("faux")
FinSi

4. (4, 2, 11) : « 4 - 11 = ? », réponse −7\boxed{-7} ; (12, 1, 5) : « 12 + 5 = ? », réponse 17\boxed{17}.

4 Drill SD-L.4 — multiplicateur aléatoire dans le calcul d'un code, puis complétion par des zéros
Entraînement 04 / 04

Drill SD-L.4 — multiplicateur aléatoire dans le calcul d'un code, puis complétion par des zéros

4 questionsCorrigé masqué

Une agence attribue à chaque réservation, identifiée par un numéro n de 3 chiffres, un code de 5 caractères : on multiplie n par un entier aléatoire X de l'intervalle [12, 75], puis on complète le produit par des zéros à gauche jusqu'à obtenir 5 chiffres. Exemples : n = 245 et X = 13 donnent 3185, d'où le code "03185" ; n = 907 et X = 64 donnent "58048".

  1. Écrire l'instruction qui tire X avec la fonction Aléa(a, b), puis avec l'ancienne fonction Aléa(n), qui retourne un entier de 0 à n − 1.
  2. Montrer que le produit n * X a toujours 4 ou 5 chiffres.
  3. Écrire l'algorithme d'une fonction Coder (n : Entier) : Chaîne qui retourne le code, et dresser son T.D.O.L.
  4. Un élève écrit X ← 12 + Aléa(63). Quelle valeur de l'intervalle n'est jamais tirée ?
Voir la correction commentéeAprès avoir posé votre démarche

1. X ← Aléa(12, 75). L'intervalle compte 75 − 12 + 1 = 64 valeurs : X ← 12 + Aléa(64).

2. n va de 100 à 999 et X de 12 à 75 : le plus petit produit est 100 × 12 = 1200, qui a 4 chiffres, et le plus grand 999 × 75 = 74925, qui en a 5. Il faut donc ajouter au plus un zéro.

3.

Fonction Coder (n : Entier) : Chaîne
DEBUT
    X ← Aléa(12, 75)
    ch ← Convch(n * X)
    Tant que Long(ch) < 5 Faire
        ch ← "0" + ch
    Fin Tant que
    Retourner ch
FIN

T.D.O.L : X — Entier — multiplicateur aléatoire ; ch — Chaîne — code en construction. Le zéro est concaténé devant la chaîne : un entier ne peut pas garder de zéro à gauche.

4. Aléa(63) donne 0 à 62, donc X va de 12 à 74 : la valeur 75 n'est jamais tirée.

Relier ce raisonnement au bac

Choisis une filière pour voir les sujets qui étayent ce scénario.