exercices/3e/3S21.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import { choice, combinaisonListesSansChangerOrdre, contraindreValeur, listeQuestionsToContenu, numAlpha, premiereLettreEnMajuscule, randint, rangeMinMax, shuffle, tableauColonneLigne } from '../../modules/outils.js'
import { fraction } from '../../modules/fractions.js'
import { Arbre } from '../../modules/arbres.js'

import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
import { context } from '../../modules/context.js'
export const titre = 'Expérience aléatoire à deux épreuves'
export const dateDePublication = '15/01/2022'
export const interactifReady = true
export const interactifType = 'mathLive'

/**
 * On doit calculer la probabilité qu'un événement se réalise après une expérience aléatoire à deux épreuves
 * @author Jean-Claude Lhote
 * Référence 3S21
*/
export const uuid = '76230'
export const ref = '3S21'
export default function CalculProbaExperience2Epreuves3e () {
  Exercice.call(this) // Héritage de la classe Exercice()

  this.besoinFormulaireTexte = ['Type de question', '1 : Deux épreuves\n2 : Deux épreuves avec Remise\n3 : Deux épreuves sans remise\n4 : Mélange']
  this.sup = 1
  this.tailleDiaporama = 1
  this.nbQuestions = 1
  this.spacing = context.isHtml ? 2 : 1.5
  this.spacingCorr = context.isHtml ? 2 : 1.5
  this.nouvelleVersion = function () {
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []
    let QuestionsDisponibles = []

    if (!this.sup) { // Si aucune liste n'est saisie
      QuestionsDisponibles = rangeMinMax(1, 3)
    } else {
      if (typeof (this.sup) === 'number') { // Si c'est un nombre c'est que le nombre a été saisi dans la barre d'adresses
        QuestionsDisponibles[0] = contraindreValeur(1, 3, this.sup, 2)
      } else {
        QuestionsDisponibles = this.sup.split('-')// Sinon on créé un tableau à partir des valeurs séparées par des -
        for (let i = 0; i < QuestionsDisponibles.length; i++) { // on a un tableau avec des strings : ['1', '1', '2']
          QuestionsDisponibles[i] = contraindreValeur(1, 3, parseInt(QuestionsDisponibles[i]), 2) // parseInt en fait un tableau d'entiers
        }
        this.nbQuestions = Math.max(this.nbQuestions, QuestionsDisponibles.length)
      }
    }
    QuestionsDisponibles = combinaisonListesSansChangerOrdre(QuestionsDisponibles, this.nbQuestions)
    for (let i = 0, cpt = 0, NoQuestion = 0, question; i < this.nbQuestions && cpt < 50;) {
      switch (QuestionsDisponibles[i]) {
        case 1: question = unePieceDeuxUrnes(this, NoQuestion, true, false, true)
          break
        case 2: question = urneDeuxTiragesAvecRemise(this, NoQuestion, true, false, true)
          break
        case 3: question = urneDeuxTiragesSansRemise(this, NoQuestion, true, false, true)
          break
      }

      if (this.questionJamaisPosee(i, ...question.alea)) {
        this.listeQuestions.push(question.texte)
        this.listeCorrections.push(question.texteCorr)
        NoQuestion = question.NoQuestion
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
}

// On Tire à pile ou face pour choisir une urne puis on tire une boule.
function unePieceDeuxUrnes (exercice, NoQuestion, sup, sup2, sup3) {
  const p = []
  const choix1 = randint(0, 2)
  const choix2 = randint(0, 2, choix1)
  let nombres1, nombres2, n1, n2, urne1, urne2, texte, texteCorr
  if (!sup3) {
    nombres1 = choice([[1, 2, 3], [1, 1, 2], [1, 2, 2], [1, 1, 3]])
    nombres2 = choice([[1, 2, 3], [1, 1, 2], [1, 2, 2], [1, 1, 3]])
  } else {
    nombres1 = [1, 2, 3]
    nombres2 = [1, 2, 3]
  }
  const B = ['B', 'R', 'V']
  const boules = ['bleue', 'rouge', 'verte']
  do {
    n1 = shuffle(nombres1)
    n2 = shuffle(nombres2)
  } while (n1[0] === n2[0] && n1[1] === n2[1])
  const card1 = n1[0] + n1[1] + n1[2]
  const card2 = n2[0] + n2[1] + n2[2]
  if (sup2) {
    urne1 = new Arbre({
      racine: false,
      rationnel: true,
      nom: 'Pile',
      proba: fraction(0.5),
      visible: true,
      alter: '',
      enfants: []
    })
    urne2 = new Arbre({
      racine: false,
      rationnel: true,
      nom: 'Face',
      proba: fraction(0.5),
      visible: true,
      alter: '',
      enfants: []
    })
    for (let j = 0; j < 3; j++) {
      urne1.enfants.push(new Arbre({ nom: B[j], proba: fraction(n1[j], card1), rationnel: true, visible: true }))
    }
    for (let j = 0; j < 3; j++) {
      urne2.enfants.push(new Arbre({ nom: B[j], proba: fraction(n2[j], card2), rationnel: true, visible: true }))
    }
  } else {
    urne1 = new Arbre({
      racine: false,
      rationnel: true,
      nom: 'Pile',
      proba: fraction(0.5),
      visible: false,
      alter: '',
      enfants: []
    })
    urne2 = new Arbre({
      racine: false,
      rationnel: true,
      nom: 'Face',
      proba: fraction(0.5),
      visible: false,
      alter: '',
      enfants: []
    })
    for (let j = 0; j < 3; j++) {
      for (let b = 0; b < n1[j]; b++) {
        urne1.enfants.push(new Arbre({ nom: B[j], proba: fraction(1, card1), rationnel: true, visible: false }))
      }
    }
    for (let j = 0; j < 3; j++) {
      for (let b = 0; b < n2[j]; b++) {
        urne2.enfants.push(new Arbre({ nom: B[j], proba: fraction(1, card2), rationnel: true, visible: false }))
      }
    }
  }

  // On définit l'arbre complet
  const omega = new Arbre({
    racine: true,
    rationnel: true,
    nom: '',
    proba: 1,
    visible: false,
    alter: '',
    enfants: [
      urne1,
      urne2
    ]
  })

  omega.setTailles() // On calcule les tailles des arbres.
  const objets = omega.represente(0, 11, 0, sup2 ? 2.5 : 1.2, false, -1, 6) // On crée l'arbre complet echelle 1.4 feuilles verticales sens gauche-droite
  for (let j = 0; j < 3; j++) {
    p[j] = omega.getProba(B[j], true) // on calcule P(C) décimale.
  }
  texte = 'On lance une pièce équilibrée.<br>'
  texte += 'Si la pièce tombe sur «Pile», on tire une boule dans une urne contenant '
  for (let j = 0; j < 2; j++) {
    texte += `${n1[j]} boule${n1[j] > 1 ? 's' : ''} ${boules[j]}${n1[j] > 1 ? 's' : ''}, `
  }
  texte += ` et ${n1[2]} boule${n1[2] > 1 ? 's' : ''} ${boules[2]}${n1[2] > 1 ? 's' : ''}.<br>`
  texte += 'Si la pièce tombe sur «Face», on tire une boule dans une urne contenant '
  for (let j = 0; j < 2; j++) {
    texte += `${n2[j]} boule${n2[j] > 1 ? 's' : ''} ${boules[j]}${n2[j] > 1 ? 's' : ''}, `
  }
  texte += ` et ${n2[2]} boule${n2[2] > 1 ? 's' : ''} ${boules[2]}${n2[2] > 1 ? 's' : ''}.<br>`
  texte += sup ? 'On a représenté l\'expérience par l\'arbre ci-dessous :<br>' : ''
  texte += sup ? mathalea2d({ xmin: -0.1, xmax: 16, ymin: 0, ymax: 12, zoom: 1.3, scale: 0.5 }, ...objets) + '<br>' : ''
  texte += `Légende : ${B[0]} = ${boules[0]} ; ${B[1]} = ${boules[1]} ; ${B[2]} = ${boules[2]}<br>`
  let q = 0
  if (!exercice.interactif && !context.isAmc) {
    texte += `${numAlpha(q)} Construire un tableau à double entrée des issues de cette expérience aléatoire.<br>`
    q++
  }
  const pileOuFace = choice(['Pile', 'Face'])
  const nbBouleC = pileOuFace === 'Pile' ? n1[choix1] : n2[choix1]
  const card = pileOuFace === 'Pile' ? card1 : card2
  const proba1 = fraction(nbBouleC, card)
  const proba2 = fraction(n1[choix2] + n2[choix2], card1 + card2)
  const urne = pileOuFace === 'Pile' ? 'première' : 'deuxième'
  texte += `${numAlpha(q)} On vient de faire «${pileOuFace}». Donner la probabilité d'obtenir une boule ${boules[choix1]}.` + ajouteChampTexteMathLive(exercice, NoQuestion, 'largeur15 inline') + '<br>'
  q++
  texte += `${numAlpha(q)} On recommence l'expérience au début. Donner la probabilité d'obtenir une boule ${boules[choix2]}.` + ajouteChampTexteMathLive(exercice, NoQuestion + 1, 'largeur15 inline') + '<br>'
  q++
  const ligneEnt = ['\\text{Pièce \\textbackslash Boules}']
  const colonneEnt = ['\\text{Pile}', '\\text{Face}']
  const contenu = []
  for (let i = 0; i < 3; i++) {
    ligneEnt.push(boules[i])
    contenu.push(n1[i])
  }
  for (let i = 0; i < 3; i++) {
    contenu.push(n2[i])
  }

  const tableau = tableauColonneLigne(ligneEnt, colonneEnt, contenu)
  q = 0
  texteCorr = ''
  if (!exercice.interactif && !context.isAmc) {
    texteCorr += `${numAlpha(q)} L'issue «Pile-${boules[0]}» peut être obtenue de ${n1[0]} façon${n1[0] > 1 ? 's' : ''} et l'issue «Pile-${boules[1]}» peut être obtenue de ${n1[1]} façon${n1[1] > 1 ? 's' : ''}.<br>`
    texteCorr += 'Voici un tableau à double entrée qui représente toutes les issues de cette expérience.<br><br>'
    q++
  }
  texteCorr += tableau + '<br><br>'
  texteCorr += `${numAlpha(q)} Comme on a fait ${pileOuFace}», on va tirer une boule dans la ${urne} urne où il y a ${nbBouleC} boule${nbBouleC > 1 ? 's' : ''} ${boules[choix1]}${nbBouleC > 1 ? 's' : ''} sur ${card} boules.<br>`
  if (!context.isAmc) setReponse(exercice, NoQuestion, proba1, { formatInteractif: 'fractionEgale' })
  q++
  texteCorr += `La probabilité de cet événement est donc de $${proba1.texFraction}${!proba1.estIrreductible ? '=' + proba1.texFractionSimplifiee : ''}$.<br>`
  texteCorr += `${numAlpha(q)} Il y a équiprobabilité entre toutes les issues du tableau car, d'une part, la pièce est équilibrée et, d'autre part, chaque urne contient 6 boules.<br>`
  texteCorr += `Il y a ${n1[choix2] + n2[choix2]} issues avec une boule ${boules[choix2]} sur ${card1 + card2} issues en tout. La probabilité de cet événement est donc de $${proba2.texFraction}${!proba2.estIrreductible ? '=' + proba2.texFractionSimplifiee : ''}$.<br>`
  if (!context.isAmc) setReponse(exercice, NoQuestion + 1, proba2, { formatInteractif: 'fractionEgale' })

  return { texte: texte, texteCorr: texteCorr, alea: [...n1, ...n2], NoQuestion: NoQuestion + 2 }
}

// On tire deux boules dans une urne avec remise
function urneDeuxTiragesAvecRemise (exercice, NoQuestion, sup, sup2, niveau) { // tirage dans une urne avec remise
  const [b1Color, b2Color] = shuffle(['bleue', 'rouge', 'verte', 'orange', 'noire', 'jaune']).splice(0, 2)

  const b1Char = premiereLettreEnMajuscule(b1Color.charAt(0))
  const b2Char = premiereLettreEnMajuscule(b2Color.charAt(0))
  const nbBoule1 = randint(1, 3)
  const nbBoule2 = nbBoule1 === 1 ? randint(2, 4) : randint(1, 3, nbBoule1)
  const ligneEnt = ['\\text{Tirage1\\textbackslash Tirage2}']
  const colonneEnt = []
  const contenu = []
  const card = nbBoule1 + nbBoule2
  const tirage1 = []
  for (let i = 0; i < nbBoule1; i++) {
    tirage1.push(new Arbre({
      nom: `${b1Char}`,
      rationnel: true,
      proba: fraction(1, card),
      visible: false,
      alter: '',
      enfant: [],
      racine: false
    }))
    for (let j = 0; j < nbBoule1; j++) {
      tirage1[i].enfants.push(new Arbre({
        nom: `${b1Char} `,
        rationnel: true,
        proba: fraction(1, card),
        visible: false,
        alter: '',
        enfant: [],
        racine: false
      }))
    }
    for (let j = 0; j < nbBoule2; j++) {
      tirage1[i].enfants.push(new Arbre({
        nom: `${b2Char}`,
        rationnel: true,
        proba: fraction(1, card),
        visible: false,
        alter: '',
        enfant: [],
        racine: false
      }))
    }
  }

  for (let i = 0; i < nbBoule2; i++) {
    tirage1.push(new Arbre({
      nom: `${b2Char}`,
      rationnel: true,
      proba: fraction(1, card),
      visible: false,
      alter: '',
      enfant: [],
      racine: false
    }))
    for (let j = 0; j < nbBoule1; j++) {
      tirage1[i + nbBoule1].enfants.push(new Arbre({
        nom: `${b1Char} `,
        rationnel: true,
        proba: fraction(1, card),
        visible: false,
        alter: '',
        enfant: [],
        racine: false
      }))
    }
    for (let j = 0; j < nbBoule2; j++) {
      tirage1[i + nbBoule1].enfants.push(new Arbre({
        nom: `${b2Char} `,
        rationnel: true,
        proba: fraction(1, card),
        visible: false,
        alter: '',
        enfant: [],
        racine: false
      }))
    }
  }
  const omega = new Arbre({
    nom: '',
    rationnel: true,
    proba: 1,
    visible: false,
    alter: '',
    enfants: tirage1,
    racine: true
  })

  for (let i = 0; i < 2; i++) {
    ligneEnt.push(`${i === 0 ? '\\text{' + b1Color + '}' : '\\text{' + b2Color + '}'}`)
    colonneEnt.push(`${i === 0 ? '\\text{' + b1Color + '}' : '\\text{' + b2Color + '}'}`)
    for (let j = 0; j < 2; j++) {
      contenu.push((i === 0 ? nbBoule1 : nbBoule2) * (j === 0 ? nbBoule1 : nbBoule2))
    }
  }
  const tableau = tableauColonneLigne(ligneEnt, colonneEnt, contenu)

  omega.setTailles() // On calcule les tailles des arbres.
  const objets = omega.represente(0, 12, 0, sup2 ? 2.5 : 1.6, false, -1, 6) // On crée l'arbre complet echelle 1.4 feuilles verticales sens gauche-droite
  const choix = choice([[nbBoule1, b1Color, b1Char], [nbBoule2, b2Color, b2Char]])
  const probaChoix = fraction(choix[0] ** 2, card ** 2)
  const proba1 = fraction(nbBoule1 ** 2, card ** 2)
  const proba2 = fraction(nbBoule2 ** 2, card ** 2)
  const proba1et2 = proba1.sommeFraction(proba2)
  const proba3 = fraction(nbBoule1 * nbBoule2, card ** 2)
  const proba4 = proba3.multiplieEntier(2)
  let texte = `Dans une urne, il y a ${nbBoule1} boule${nbBoule1 > 1 ? 's' : ''} ${b1Color}${nbBoule1 > 1 && b1Char !== 'O' ? 's' : ''} et ${nbBoule2} boule${nbBoule2 > 1 ? 's' : ''} ${b2Color}${nbBoule2 > 1 && b2Char !== 'O' ? 's' : ''} indiscernables au toucher.<br>`
  texte += 'On tire successivement et avec remise deux boules.<br>'
  texte += `${numAlpha(0)} Déterminer la probabilité d'obtenir deux boules ${choix[1]}${choix[2] !== 'O' ? 's' : ''}.` + ajouteChampTexteMathLive(exercice, NoQuestion, 'largeur10 inline') + '<br>'
  texte += `${numAlpha(1)} Déterminer la probabilité d'obtenir deux boules de la même couleur.` + ajouteChampTexteMathLive(exercice, NoQuestion + 1, 'largeur10 inline') + '<br>'
  texte += `${numAlpha(2)} Déterminer la probabilité d'obtenir deux boules de couleurs différentes.` + ajouteChampTexteMathLive(exercice, NoQuestion + 2, 'largeur10 inline') + '<br>'
  let texteCorr = `L'issue «${b1Color}-${b1Color}» peut être obtenue de ${contenu[0]} façon${contenu[0] > 1 ? 's' : ''} et l'issue «${b1Color}-${b2Color}» peut être obtenue de ${contenu[1]} façon${contenu[1] > 1 ? 's' : ''}.<br>`
  texteCorr += 'Voici un tableau à double entrée qui représente toutes les issues de cette expérience.<br><br>'
  texteCorr += tableau + '<br><br>'
  texteCorr += 'On peut aussi présenter les deux épreuves sous la forme d\'un arbre de dénombrement :<br>'
  texteCorr += mathalea2d({ xmin: 0, xmax: card * 8.5, ymin: 0, ymax: 13, zoom: 0.8, scale: 9 / card / card }, ...objets) + '<br>'
  texteCorr += `Légende : ${b1Char} = ${b1Color} et ${b2Char} = ${b2Color}.<br>`
  texteCorr += `${numAlpha(0)} L'événement «obtenir deux boules ${choix[1]}${choix[2] !== 'O' ? 's' : ''}» est réalisé par l'issue {${choix[2] + choix[2]}}.`
  texteCorr += ` On comptabilise ${choix[0] ** 2} issues {${choix[2] + choix[2]}} sur ${card ** 2} issues en tout.<br>`
  texteCorr += `La probabilité de cet événement est donc de $${probaChoix.texFraction}${!probaChoix.estIrreductible ? '=' + probaChoix.texFractionSimplifiee : ''}$.<br>`
  texteCorr += `${numAlpha(1)} L'événement «obtenir deux boules de la même couleur» est réalisé par les issues {${b1Char + b1Char}, ${b2Char + b2Char}}.`
  texteCorr += ` On comptabilise ${nbBoule1 ** 2} issues {${b1Char + b1Char}} et   ${nbBoule2 ** 2} issues {${b2Char + b2Char}} sur ${card ** 2} issues en tout.<br>`
  texteCorr += `La probabilité de cet événement est donc de $${proba1.texFraction}+${proba2.texFraction}`
  texteCorr += `=${proba1et2.texFraction}${!proba1et2.estIrreductible ? '=' + proba1et2.texFractionSimplifiee : ''}$.<br>`

  texteCorr += `${numAlpha(2)} L'événement «obtenir deux boules de couleurs différentes» est réalisé par les issues {${b1Char + b2Char}, ${b2Char + b1Char}}.`
  texteCorr += ` On comptabilise ${nbBoule1 * nbBoule2} issues {${b1Char + b2Char}} et autant d'issues {${b2Char + b1Char}} sur ${card ** 2} issues en tout.<br>`
  texteCorr += `La probabilité de cet événement est donc de $2\\times ${proba3.texFraction}=${proba4.texFraction}${!proba4.estIrreductible ? '=' + proba4.texFractionSimplifiee : ''}$.<br>`
  texteCorr += `Une autre façon de faire est de considérer que c'est l'événement contraire de «obtenir deux boules de la même couleur» dont on a calculé la probabilité à la question ${numAlpha(1)}.<br>`
  texteCorr += `On peut donc calculer la probabilité de cet événement en calculant : $1 -${proba1et2.texFractionSimplifiee} = ${proba1et2.entierMoinsFraction(1).texFractionSimplifiee}$.`
  if (!context.isAmc) setReponse(exercice, NoQuestion, probaChoix, { formatInteractif: 'fractionEgale' })
  if (!context.isAmc) setReponse(exercice, NoQuestion + 1, proba1et2, { formatInteractif: 'fractionEgale' })
  if (!context.isAmc) setReponse(exercice, NoQuestion + 2, proba4, { formatInteractif: 'fractionEgale' })

  return { texte: texte, texteCorr: texteCorr, alea: [nbBoule1, nbBoule2, b1Char, b2Char], NoQuestion: NoQuestion + 3 }
}

// On tire deux boules dans une urne sans remise
function urneDeuxTiragesSansRemise (exercice, NoQuestion, sup, sup2, niveau) { // tirage dans une urne avec remise
  const [b1Color, b2Color] = shuffle(['bleue', 'rouge', 'verte', 'orange', 'noire', 'jaune']).splice(0, 2)

  const b1Char = premiereLettreEnMajuscule(b1Color.charAt(0))
  const b2Char = premiereLettreEnMajuscule(b2Color.charAt(0))
  const nbBoule1 = randint(2, 3)
  const nbBoule2 = randint(2, 3, nbBoule1)
  const ligneEnt = ['\\text{Tirage1\\textbackslash Tirage2}']
  const colonneEnt = []
  const contenu = []
  const card = nbBoule1 + nbBoule2
  const tirage1 = []
  for (let i = 0; i < nbBoule1; i++) {
    tirage1.push(new Arbre({
      nom: `${b1Char}`,
      rationnel: true,
      proba: fraction(1, card),
      visible: false,
      alter: '',
      enfant: [],
      racine: false
    }))
    for (let j = 0; j < nbBoule1 - 1; j++) {
      tirage1[i].enfants.push(new Arbre({
        nom: `${b1Char} `,
        rationnel: true,
        proba: fraction(1, card),
        visible: false,
        alter: '',
        enfant: [],
        racine: false
      }))
    }
    for (let j = 0; j < nbBoule2; j++) {
      tirage1[i].enfants.push(new Arbre({
        nom: `${b2Char}`,
        rationnel: true,
        proba: fraction(1, card),
        visible: false,
        alter: '',
        enfant: [],
        racine: false
      }))
    }
  }

  for (let i = 0; i < nbBoule2; i++) {
    tirage1.push(new Arbre({
      nom: `${b2Char}`,
      rationnel: true,
      proba: fraction(1, card),
      visible: false,
      alter: '',
      enfant: [],
      racine: false
    }))
    for (let j = 0; j < nbBoule1; j++) {
      tirage1[i + nbBoule1].enfants.push(new Arbre({
        nom: `${b1Char} `,
        rationnel: true,
        proba: fraction(1, card),
        visible: false,
        alter: '',
        enfant: [],
        racine: false
      }))
    }
    for (let j = 0; j < nbBoule2 - 1; j++) {
      tirage1[i + nbBoule1].enfants.push(new Arbre({
        nom: `${b2Char} `,
        rationnel: true,
        proba: fraction(1, card),
        visible: false,
        alter: '',
        enfant: [],
        racine: false
      }))
    }
  }
  const omega = new Arbre({
    nom: '',
    rationnel: true,
    proba: 1,
    visible: false,
    alter: '',
    enfants: tirage1,
    racine: true
  })

  for (let i = 0; i < 2; i++) {
    ligneEnt.push(`${i === 0 ? '\\text{' + b1Color + '}' : '\\text{' + b2Color + '}'}`)
    colonneEnt.push(`${i === 0 ? '\\text{' + b1Color + '}' : '\\text{' + b2Color + '}'}`)
    for (let j = 0; j < 2; j++) {
      contenu.push(i === 0 ? (j === 0 ? (nbBoule1 - 1) * nbBoule1 : nbBoule1 * nbBoule2) : (j === 0 ? nbBoule1 * nbBoule2 : nbBoule2 * (nbBoule2 - 1)))
    }
  }

  const tableau = tableauColonneLigne(ligneEnt, colonneEnt, contenu)

  omega.setTailles() // On calcule les tailles des arbres.
  const objets = omega.represente(0, 12, 0, sup2 ? 2.5 : 1.6, false, -1, 6) // On crée l'arbre complet echelle 1.4 feuilles verticales sens gauche-droite
  const choix = choice([[nbBoule1, b1Color, b1Char], [nbBoule2, b2Color, b2Char]])
  const probaChoix = fraction(choix[0] ** 2 - choix[0], card ** 2 - card)
  const proba1 = fraction(nbBoule1 ** 2 - nbBoule1, card ** 2 - card)
  const proba2 = fraction(nbBoule2 ** 2 - nbBoule2, card ** 2 - card)
  const proba1et2 = proba1.sommeFraction(proba2)
  const proba3 = fraction(nbBoule1 * nbBoule2, card ** 2 - card)
  const proba4 = proba3.multiplieEntier(2)
  let texte = `Dans une urne, il y a ${nbBoule1} boule${nbBoule1 > 1 ? 's' : ''} ${b1Color}${nbBoule1 > 1 && b1Char !== 'O' ? 's' : ''} et ${nbBoule2} boule${nbBoule2 > 1 ? 's' : ''} ${b2Color}${nbBoule2 > 1 && b2Char !== 'O' ? 's' : ''} indiscernables au toucher.<br>`
  texte += 'On tire successivement et sans remise deux boules.<br>'
  texte += `${numAlpha(0)} Déterminer la probabilité d'obtenir deux boules ${choix[1]}${choix[2] !== 'O' ? 's' : ''}.` + ajouteChampTexteMathLive(exercice, NoQuestion, 'largeur10 inline') + '<br>'
  texte += `${numAlpha(1)} Déterminer la probabilité d'obtenir deux boules de la même couleur.` + ajouteChampTexteMathLive(exercice, NoQuestion + 1, 'largeur10 inline') + '<br>'
  texte += `${numAlpha(2)} Déterminer la probabilité d'obtenir deux boules de couleurs différentes.` + ajouteChampTexteMathLive(exercice, NoQuestion + 2, 'largeur10 inline') + '<br>'
  let texteCorr = `L'issue «${b1Color}-${b1Color}» peut être obtenue de ${contenu[0]} façon${contenu[0] > 1 ? 's' : ''} et l'issue «${b1Color}-${b2Color}» peut être obtenue de ${contenu[1]} façon${contenu[1] > 1 ? 's' : ''}.<br>`
  texteCorr += 'On a représenté les issues de l\'expérience par le tableau ci-dessous :<br><br>'
  texteCorr += tableau + '<br><br>'
  texteCorr += 'On peut aussi présenter les issues sous la forme d\'un arbre de dénombrement :<br>'
  texteCorr += mathalea2d({ xmin: 0, xmax: card * 8.5, ymin: 0, ymax: 13, zoom: 0.8, scale: 9 / card / card }, ...objets) + '<br>'
  texteCorr += `Légende : ${b1Char} = ${b1Color} et ${b2Char} = ${b2Color}.<br>`
  texteCorr += `${numAlpha(0)} L'événement «obtenir deux boules ${choix[1]}${choix[2] !== 'O' ? 's' : ''}» est réalisé par l'issue {${choix[2] + choix[2]}}.`
  texteCorr += ` On comptabilise ${choix[0] ** 2 - choix[0]} issues {${choix[2] + choix[2]}} sur ${card ** 2 - card} issues en tout.<br>`
  texteCorr += `La probabilité de cet événement est donc de $${probaChoix.texFraction}${!probaChoix.estIrreductible ? '=' + probaChoix.texFractionSimplifiee : ''}$.<br>`
  texteCorr += `${numAlpha(1)} L'événement «obtenir deux boules de la même couleur» est réalisé par les issues {${b1Char + b1Char}, ${b2Char + b2Char}}.`
  texteCorr += ` On comptabilise ${nbBoule1 ** 2 - nbBoule1} issues {${b1Char + b1Char}} et   ${nbBoule2 ** 2 - nbBoule2} issues {${b2Char + b2Char}} sur ${card ** 2 - card} issues en tout.<br>`
  texteCorr += `La probabilité de cet événement est donc de $${proba1.texFraction}+${proba2.texFraction}`
  texteCorr += `=${proba1et2.texFraction}${!proba1et2.estIrreductible ? '=' + proba1et2.texFractionSimplifiee : ''}$.<br>`

  texteCorr += `${numAlpha(2)} L'événement «obtenir deux boules de couleurs différentes» est réalisé par les issues {${b1Char + b2Char}, ${b2Char + b1Char}}.`
  texteCorr += ` On comptabilise ${nbBoule1 * nbBoule2} issues {${b1Char + b2Char}} et autant d'issues {${b2Char + b1Char}} sur ${card ** 2 - card} issues en tout.<br>`
  texteCorr += `La probabilité de cet événement est donc de $2\\times ${proba3.texFraction}=${proba4.texFraction}${!proba4.estIrreductible ? '=' + proba4.texFractionSimplifiee : ''}$.<br>`
  texteCorr += `Une autre façon de faire est de considérer que c'est l'événement contraire de «obtenir deux boules de la même couleur» dont on a calculé la probabilité à la question ${numAlpha(1)}.<br>`
  texteCorr += `On peut donc calculer la probabilité de cet événement en calculant : $1 -${proba1et2.texFractionSimplifiee} = ${proba4.texFractionSimplifiee}$.`
  if (!context.isAmc) setReponse(exercice, NoQuestion, probaChoix, { formatInteractif: 'fractionEgale' })
  if (!context.isAmc) setReponse(exercice, NoQuestion + 1, proba1et2, { formatInteractif: 'fractionEgale' })
  if (!context.isAmc) setReponse(exercice, NoQuestion + 2, proba4, { formatInteractif: 'fractionEgale' })
  return { texte: texte, texteCorr: texteCorr, alea: [nbBoule1, nbBoule2, b1Char, b2Char], NoQuestion: NoQuestion + 3 }
}