PROJET AUTOBLOG


®om's blog

Site original : ®om's blog

⇐ retour index

Mise à jour

Mise à jour de la base de données, veuillez patienter...

Paradoxes probabilistes

dimanche 9 décembre 2012 à 21:11

Ce sont des cas d’école, mais j’adore ces quelques paradoxes. La simplicité de leurs énoncés et l’évidence de leur solution nous permettent de répondre en quelques secondes, sans aucune hésitation. Mais en nous trompant.

Deux enfants

Un couple a deux enfants dont l’un d’eux (au moins) est une fille. Quelle est la probabilité que l’autre soit (aussi) une fille ?

Par hypothèse, la probabilité à chaque naissance d’avoir un garçon est égale à celle d’avoir une fille (50%), et les naissances sont indépendantes.

La réponse 1/2 est évidente. Mais fausse. La bonne réponse est 1/3.

En effet, un couple ayant deux enfants a 4 possiblités équiprobables :

  1. garçon-garçon
  2. garçon-fille
  3. fille-garçon
  4. fille-fille

Sachant que l’un des deux est une fille, le cas 1 est exclu : il reste trois possibilités équiprobables, dont une seule correspond au cas fille-fille. Il y a donc une chance sur trois que les deux enfants soient des filles. CQFD

Pour vous en convaincre, considérez les deux phrases équivalentes suivantes :

Pour chacune d’elles, demandez-vous quelle est la probabilité que les deux enfants soient des filles.

Attendez d’être convaincus de ce résultat avant de passer à la suite.

Fausse implication

Une fois ce résultat compris, considérons l’énoncé suivant :

Un couple a deux enfants. Je le croise dans la rue avec l’un de ses enfants, qui est une fille. Quelle est la probabilité que l’autre enfant (celui qui est absent) soit (aussi) une fille.

Il est possible de répondre avec certitude : s’il est absent, c’est un garçon, si elle est absente, c’est une fille. (Ça, c’est fait !)

Alors vous appliquez le même raisonnement, et répondez 1/3.
Après tout, nous sommes exactement dans le cas de l’énoncé précédent : un couple a deux enfants et je sais que l’un d’eux (au moins) est une fille.

Mais non, c’est faux. Ici, la réponse est 1/2.

Pour le comprendre, il faut voir que le raisonnement menant à la réponse 1/3 n’est en fait tout-à-fait valide qu’en levant une légère ambiguïté de l’énoncé, celle de l’acquisition de l’information : comment savons-nous que le couple ayant deux enfants a au moins une fille (pour déterminer la probabilité qu’il en ait deux) ?

Si nous avons demandé à l’un des parents « avez-vous (au moins) une fille ? » et qu’il a répondu « oui », alors la probabilité que les deux soient des filles est bien 1/3.

Par contre, si nous lui avons demandé « indiquez-moi le sexe de l’un de vos enfants » et qu’il a répondu « j’ai (au moins) une fille », alors la probabilité que les deux soient des filles est 1/2. En effet, le fait que le parent puisse répondre garçon à cette question lorsqu’il a deux enfants de sexes différents fait baisser la probabilité conditionnelle des cas 2 et 3, et une fois le cas 1 exclu, l’union des 2 et 3 et le cas 4 sont équiprobables. Relisez la phrase précédente plusieurs fois. Comme elle n’est pas claire, consultez le calcul sur Wikipedia.

Le fait de rencontrer un enfant de ce couple (ici, une fille) s’apparente à ce dernier cas (car pour deux enfants de sexes différents, nous aurions pu rencontrer le garçon). Ainsi, la probabilité que l’autre soit une fille est 1/2.

Si ce n’est pas clair, continuez, j’en reparle un peu plus loin lorsque j’évoque la particularisation.

Deux enfants, un jour

Un couple a deux enfants dont l’un d’eux (au moins) est une fille née un mardi. Quelle est la probabilité que l’autre soit (aussi) une fille ?

La réponse n’est ni 1/2, ni 1/3, mais 13/27.

Un bash vaut mieux qu’un long discours :

printf '%s\n' {G,F}{0..6}-{G,F}{0..6} | grep F1 | wc -l
printf '%s\n' {G,F}{0..6}-{G,F}{0..6} | grep F1 | grep F.-F. | wc -l

(Nous supposons avoir obtenu l’information en demandant à l’un des parents « avez-vous une fille née un mardi ? ». Comme dans le premier exemple, si nous lui avions demandé « indiquez-moi le sexe d’un de vos enfants ainsi que son jour de naissance », la probabilité que l’autre soit une fille serait 1/2.)

Il est également possible de différencier par autre chose qu’un jour de la semaine, par exemple faire la différence entre matin (entre minuit et midi) et après-midi (entre midi et minuit) :

Un couple a deux enfants dont l’un d’eux (au moins) est une fille née un matin. Quelle est la probabilité que l’autre soit (aussi) une fille ?

La réponse est 3/7 :

printf '%s\n' {G,F}{M,A}-{G,F}{M,A} | grep FM | wc -l
printf '%s\n' {G,F}{M,A}-{G,F}{M,A} | grep FM | grep F.-F. | wc -l

Deux enfants, un prénom

Supposons maintenant qu’aucun couple n’appelle deux de ses enfants par le même prénom, et considérons l’énoncé suivant :

Un couple a deux enfants dont l’un d’eux (au moins) est une fille prénommée Sophie. Quelle est la probabilité que l’autre soit (aussi) une fille ?

La réponse ici est 1/2.

Si vous avez compris le résultat du script bash précédent, cela revient à supposer que les enfants ne peuvent pas être nés le même jour de la semaine (ce qui est absurde pour un jour de la semaine, mais pas pour un prénom).

printf '%s\n' {G,F}{0..6}-{G,F}{0..6} | grep -v '^.\(.\)-.\1' | grep F1 | wc -l
printf '%s\n' {G,F}{0..6}-{G,F}{0..6} | grep -v '^.\(.\)-.\1' | grep F1 | grep F.-F. | wc -l

Synthèse et particularisation

Résumons. Sachant que l’un des deux enfants est une fille, la probabilité que les deux soient des filles dépend de la capacité à particulariser l’enfant dont on connaît le sexe. Sans aucune information supplémentaire, la probabilité est 1/3.

Mais si nous savons par exemple que l’enfant en question est l’aîné, nous le particularisons complètement : nous sommes sûrs que l’autre n’est pas l’aîné, et donc la probabilité devient 1/2 (évidemment, puisque par hypothèse, les naissances sont indépendantes). De même, si nous supposons qu’un couple ne donne pas le même prénom à plusieurs de ses enfants, alors préciser le prénom particularise complètement l’enfant dont on parle. Il en va de même si nous rencontrons l’un des enfants dans la rue : c’est de celui qui est présent dont on parle, pas n’importe lequel.

Et il existe des cas intermédiaires, où nous ne particularisons que partiellement. Par exemple, en précisant que l’enfant est né un mardi, dans certains cas l’information est différenciante (l’autre enfant n’est pas né un mardi), dans certains cas non (les deux enfants sont nés un mardi). Le résultat n’est donc ni 1/3, ni 1/2, mais entre les deux (13/27 ici).

Si vous avez du mal à vous convaincre que rencontrer l’un des enfants dans la rue le particularise (et donc donne une probabilité de 1/2 que l’autre soit une fille ou un garçon), je vous propose l’expérience de pensée suivante (par l’absurde). Vous rencontrez le couple avec l’un de ses enfants, qui est une fille. D’après le tout premier raisonnement, vous en concluez que la probabilité que l’autre soit une fille est 1/3. Vous lui parlez, et vous lui demandez quel jour de la semaine elle est née, elle vous répond mardi. Vous savez maintenant que c’est une fille née un mardi. D’après ce que nous venons de voir, vous en concluez que la probabilité que l’autre soit une fille est 13/27. Mais le résultat aurait été le même si elle avait répondu n’importe quel autre jour de la semaine. Le fait d’avoir posé la question a donc changé la probabilité, et ceci, indépendemment de sa réponse. Comment pourrait-elle dépendre du simple fait de poser la question ? C’est incohérent.

Cette particularisation me fait d’ailleurs beaucoup penser au phénomène de décohérence quantique.

Monty Hall

Il s’agit jeu télévisé avec trois portes, dont voici les règles :

  • Derrière chacune des trois portes se trouve soit une chèvre, soit une voiture, mais une seule porte donne sur une voiture alors que deux portes donnent sur une chèvre. La porte cachant la voiture a été choisie par tirage au sort.
  • Le joueur choisit une des portes, sans que toutefois ce qui se cache derrière (chèvre ou voiture) ne soit révélé à ce stade.
  • Le présentateur sait ce qu’il y a derrière chaque porte.
  • Le présentateur doit ouvrir l’une des deux portes restantes et doit proposer au candidat la possibilité de changer de choix quant à la porte à ouvrir définitivement.
  • Le présentateur ouvrira toujours une porte derrière laquelle se cache une chèvre, en effet :
    • Si le joueur choisit une porte derrière laquelle se trouve une chèvre, le présentateur ouvrira l’autre porte où il sait que se trouve également une chèvre.
    • Si le joueur choisit la porte cachant la voiture, le présentateur choisit au hasard parmi les deux portes cachant une chèvre. (on peut supposer qu’un tirage au sort avant l’émission a décidé si ce serait la plus à droite ou à gauche)
  • Le présentateur doit offrir la possibilité au candidat de rester sur son choix initial ou bien de revenir dessus et d’ouvrir la porte qui n’a été choisie ni par lui-même, ni par le candidat.

La question qui se pose alors est : le joueur augmente-t-il ses chances de gagner la voiture en changeant son choix initial ?

Vu qu’il reste deux portes, nous pourrions nous dire que garder son choix initial ou le changer n’a pas d’incidence sur les probabilités. Ce qui évidemment est faux (sinon nous n’en parlerions pas). En réalité, il a une probabilité de 1/3 de gagner s’il conserve son choix initial et 2/3 s’il en change.

Lors de son choix initial, le joueur a une chance sur trois de sélectionner la porte gagnante. S’il décide de toujours garder sa porte, il a donc une chance sur trois de gagner. Comme à la fin il n’a que deux choix (garder ou changer), il aurait eu deux chances sur trois de gagner en changeant de porte.

Pour mieux comprendre, généralisons le principe du jeu :

La réponse devient évidente, non ?

Si vous n’êtes pas convaincus, développeur et que vous connaissez la loi des grands nombres, ce programme devrait vous aider :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{
  int i, winning, choice, elim, change;
  int keepwin = 0, changewin = 0;

  /* Initialise le seed pour la génération aléatoire */
  srand(time(NULL));

  for (i = 0; i < 10000; i++) {
    /* Tire au sort une porte gagnante et un choix du joueur */
    winning = rand() % 3;
    choice = rand() % 3;

    /* Présentateur */
    if (choice == winning)
      /* Choisit aléatoirement d'éliminer l'une des deux autres portes */
      elim = ~winning & (rand() % 2 + 1);
    else
      /* Désigne la porte restante perdante */
      elim = 3 - choice - winning;

    /* Compte les choix vainqueurs */
    change = 3 - choice - elim;
    keepwin += choice == winning;
    changewin += change == winning;
  }

  printf("Victoires en gardant son choix   : %d\n", keepwin);
  printf("Victoires en changeant son choix : %d\n", changewin);
  return 0;
}

Notez que rand() % 3 ne fournira pas une distribution strictement uniforme (3 n’étant pas une puissance de 2), mais la précision nous suffira ici.

Ce problème est similaire au paradoxe des prisonniers.

Variante

Changeons un peu les règles : maintenant, le présentateur ne sait pas où se trouve la porte gagnante.
Du coup, une fois que le joueur a choisi sa porte, le présentateur indique une porte au hasard parmi les deux restantes. Si malheureusement il tombe sur la porte gagnante, la partie est annulée et on recommence.

Ainsi nous retirons toutes les parties où le présentateur a ouvert la porte gagnante. Il ne reste donc plus que les parties où il désigne une porte perdante, et nous nous retrouvons dans le même cas que précédement.

Eh bien, en fait, non. Ce n’est pas le même cas que précédemment, car maintenant le joueur va gagner avec un probabilité est de 1/2 qu’il garde sa porte ou qu’il en change. La preuve :

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int i = 0, winning, choice, elim, change;
  int keepwin = 0, changewin = 0;

  /* Initialise le seed pour la génération aléatoire */
  srand(time(NULL));

  while (i < 10000) {
    /* Tire au sort une porte gagnante et un choix du joueur */
    winning = rand() % 3;
    choice = rand() % 3;

    /* Présentateur */
    elim = ~choice & (rand() % 2 + 1);
    if (elim == winning)
      continue;

    /* Compte les choix vainqueurs */
    change = 3 - choice - elim;
    keepwin += choice == winning;
    changewin += change == winning;
    i++;
  }

  printf("Victoires en gardant son choix   : %d\n", keepwin);
  printf("Victoires en changeant son choix : %d\n", changewin);
  return 0;
}

Intuitivement, si c’est le hasard qui détermine à la fois la porte choisie par le joueur et la porte laissée par le présentateur, et que nous supprimons toutes les parties où le présentateur a éliminé la porte gagnante (en moyenne 1 partie sur 3), tout se passe comme s’il n’y avait que 2 portes dès le début du jeu.

Dissonance

« sonance »

Nous disposons de pastilles de 3 couleurs (disons rouge, bleu et vert).
Nous proposons à un singe de choisir parmi 2 de ces couleurs (par exemple rouge et bleu) celle qu’il préfère (par une méthode quelconque). Il répond « rouge ».
Nous lui demandons alors laquelle il préfère parmi la couleur qu’il n’a pas choisie la première fois (bleu) et celle qui reste (vert). Et le plus souvent (environ 2 fois sur 3), les chercheurs ont observé qu’il rejetait encore la couleur qu’il n’avait pas choisie la première fois (bleu).

Cela montre qu’une fois que nous rejetons quelque chose, nous le dévaluons, ce qui nous amène à le rejeter de nouveau lors d’un second choix.

Ou pas. En réalité, ce raisonnement souffre de la même erreur de raisonnement qui nous induit en erreur dans le problème de Monty Hall.

Supposons que le singe sache trier les trois couleurs par ordre de préférence. Nous lui en montrons deux. Cela revient à choisir au premier tour celle que nous ne lui montrons pas.

Cette couleur non choisie peut être :

  1. celle que le singe préfère ;
  2. la deuxième ;
  3. celle qu’il aime le moins.

Parmi ces 3 possibilités équiprobables, seule la position 3 lui fera la rejeter lors du second choix (c’est la seule moins bonne que la moins bonne du premier choix).

Test positif

Une maladie X touche 1 personne sur 100 000 dans une population. Un test de la maladie X est fiable à 99%. Il se révèle positif pour vous. Quelle est la probabilité que vous soyez infecté ?

Aussi surprenant que cela puisse paraître, la réponse est 0,1%.

Faisons le calcul sur une population de 10 millions de personnes. La maladie touche 1 personne sur 100 000, donc 100 personnes en moyenne.

Le test est fiable à 99%, donc il provoque 1% d’erreur. Sur les 9 999 900 personnes non malades, il y a donc 99 999 erreurs (faux-positifs). Sur les 100 malades, il y a 1 erreur (faux-négatif).

En tout, en moyenne 99 999 + 99 = 100 098 personnes seront testées positives, alors que seules 99 seront malades. Donc si votre test est positif, vous avez 99 chances sur 100 098 d’être malade, soit moins de 0,1%.

Le fait que ce résultat soit surprenant pour notre cerveau provient d’un biais cognitif appelé l’oubli de la fréquence de base.

Conclusion

Méfiez-vous de vos intuitions en probabilités.

Paradoxes probabilistes

dimanche 9 décembre 2012 à 20:11

Ce sont des cas d’école, mais j’adore ces quelques paradoxes. La simplicité de leurs énoncés et l’évidence de leur solution nous permettent de répondre en quelques secondes, sans aucune hésitation. Mais en nous trompant.

Deux enfants

Un couple a deux enfants dont l’un d’eux (au moins) est une fille. Quelle est la probabilité que l’autre soit (aussi) une fille ?

Par hypothèse, la probabilité à chaque naissance d’avoir un garçon est égale à celle d’avoir une fille (50%), et les naissances sont indépendantes.

La réponse 1/2 est évidente. Mais fausse. La bonne réponse est 1/3.

En effet, un couple ayant deux enfants a 4 possiblités équiprobables :

  1. garçon-garçon
  2. garçon-fille
  3. fille-garçon
  4. fille-fille

Sachant que l’un des deux est une fille, le cas 1 est exclu : il reste trois possibilités équiprobables, dont une seule correspond au cas fille-fille. Il y a donc une chance sur trois que les deux enfants soient des filles. CQFD.

Pour vous en convaincre, considérez les deux phrases équivalentes suivantes :

Pour chacune d’elles, demandez-vous quelle est la probabilité que les deux enfants soient des filles.

Attendez d’être convaincus de ce résultat avant de passer à la suite.

Fausse implication

Une fois ce résultat compris, considérons l’énoncé suivant :

Un couple a deux enfants. Je le croise dans la rue avec l’un de ses enfants, qui est une fille. Quelle est la probabilité que l’autre enfant (celui qui est absent) soit (aussi) une fille.

Il est possible de répondre avec certitude : s’il est absent, c’est un garçon, si elle est absente, c’est une fille. (Ça, c’est fait !)

Alors vous appliquez le même raisonnement, et répondez 1/3. Après tout, nous sommes exactement dans le cas de l’énoncé précédent : un couple a deux enfants et je sais que l’un d’eux (au moins) est une fille.

Mais non, c’est faux. Ici, la réponse est 1/2.

Pour le comprendre, il faut voir que le raisonnement menant à la réponse 1/3 n’est en fait tout-à-fait valide qu’en levant une légère ambiguïté de l’énoncé, celle de l’acquisition de l’information : comment savons-nous que le couple ayant deux enfants a au moins une fille (pour déterminer la probabilité qu’il en ait deux) ?

Si nous avons demandé à l’un des parents “avez-vous (au moins) une fille ?” et qu’il a répondu “oui”, alors la probabilité que les deux soient des filles est bien 1/3.

Par contre, si nous lui avons demandé “indiquez-moi le sexe de l’un de vos enfants” et qu’il a répondu “j’ai (au moins) une fille”, alors la probabilité que les deux soient des filles est 1/2. En effet, le fait que le parent puisse répondre garçon à cette question lorsqu’il a deux enfants de sexes différents fait baisser la probabilité conditionnelle des cas 2 et 3, et une fois le cas 1 exclu, l’union des 2 et 3 et le cas 4 sont équiprobables. Relisez la phrase précédente plusieurs fois. Comme elle n’est pas claire, consultez le calcul sur Wikipedia.

Le fait de rencontrer un enfant de ce couple (ici, une fille) s’apparente à ce dernier cas (car pour deux enfants de sexes différents, nous aurions pu rencontrer le garçon). Ainsi, la probabilité que l’autre soit une fille est 1/2.

Si ce n’est pas clair, continuez, j’en reparle un peu plus loin lorsque j’évoque la particularisation.

Deux enfants, un jour

Un couple a deux enfants dont l’un d’eux (au moins) est une fille née un mardi. Quelle est la probabilité que l’autre soit (aussi) une fille ?

La réponse n’est ni 1/2, ni 1/3, mais 13/27.

Un bash vaut mieux qu’un long discours :

printf '%s\n' {G,F}{0..6}-{G,F}{0..6} | grep F1 | wc -l
printf '%s\n' {G,F}{0..6}-{G,F}{0..6} | grep F1 | grep F.-F. | wc -l

(Nous supposons avoir obtenu l’information en demandant à l’un des parents “avez-vous une fille née un mardi ?”. Comme dans le premier exemple, si nous lui avions demandé “indiquez-moi le sexe d’un de vos enfants ainsi que son jour de naissance”, la probabilité que l’autre soit une fille serait 1/2.)

Il est également possible de différencier par autre chose qu’un jour de la semaine, par exemple faire la différence entre matin (entre minuit et midi) et après-midi (entre midi et minuit) :

Un couple a deux enfants dont l’un d’eux (au moins) est une fille née un matin. Quelle est la probabilité que l’autre soit (aussi) une fille ?

La réponse est 3/7 :

printf '%s\n' {G,F}{M,A}-{G,F}{M,A} | grep FM | wc -l
printf '%s\n' {G,F}{M,A}-{G,F}{M,A} | grep FM | grep F.-F. | wc -l

Deux enfants, un prénom

Supposons maintenant qu’aucun couple n’appelle deux de ses enfants par le même prénom, et considérons l’énoncé suivant :

Un couple a deux enfants dont l’un d’eux (au moins) est une fille prénommée Sophie. Quelle est la probabilité que l’autre soit (aussi) une fille ?

La réponse ici est 1/2.

Si vous avez compris le résultat du script bash précédent, cela revient à supposer que les enfants ne peuvent pas être nés le même jour de la semaine (ce qui est absurde pour un jour de la semaine, mais pas pour un prénom) :

printf '%s\n' {G,F}{0..6}-{G,F}{0..6} | grep -v '^.\(.\)-.\1' | grep F1 | wc -l
printf '%s\n' {G,F}{0..6}-{G,F}{0..6} | grep -v '^.\(.\)-.\1' | grep F1 |
    grep F.-F. | wc -l

Synthèse et particularisation

Résumons. Sachant que l’un des deux enfants est une fille, la probabilité que les deux soient des filles dépend de la capacité à particulariser l’enfant dont on connaît le sexe. Sans aucune information supplémentaire, la probabilité est 1/3.

Mais si nous savons par exemple que l’enfant en question est l’aîné, nous le particularisons complètement : nous sommes sûrs que l’autre n’est pas l’aîné, et donc la probabilité devient 1/2 (évidemment, puisque par hypothèse, les naissances sont indépendantes). De même, si nous supposons qu’un couple ne donne pas le même prénom à plusieurs de ses enfants, alors préciser le prénom particularise complètement l’enfant dont on parle. Il en va de même si nous rencontrons l’un des enfants dans la rue : c’est de celui qui est présent dont on parle, pas n’importe lequel.

Et il existe des cas intermédiaires, où nous ne particularisons que partiellement. Par exemple, en précisant que l’enfant est né un mardi, dans certains cas l’information est différenciante (l’autre enfant n’est pas né un mardi), dans certains cas non (les deux enfants sont nés un mardi). Le résultat n’est donc ni 1/3, ni 1/2, mais entre les deux (13/27 ici).

Si vous avez du mal à vous convaincre que rencontrer l’un des enfants dans la rue le particularise (et donc donne une probabilité de 1/2 que l’autre soit une fille ou un garçon), je vous propose l’expérience de pensée suivante (par l’absurde).

Vous rencontrez le couple avec l’un de ses enfants, qui est une fille. D’après le tout premier raisonnement, vous en concluez que la probabilité que l’autre soit une fille est 1/3. Vous lui parlez, et vous lui demandez quel jour de la semaine elle est née, elle vous répond mardi. Vous savez maintenant que c’est une fille née un mardi. D’après ce que nous venons de voir, vous en concluez que la probabilité que l’autre soit une fille est 13/27. Mais le résultat aurait été le même si elle avait répondu n’importe quel autre jour de la semaine. Le fait d’avoir posé la question a donc changé la probabilité, et ceci, indépendemment de sa réponse. Comment pourrait-elle dépendre du simple fait de poser la question ? C’est incohérent.

Cette particularisation me fait d’ailleurs beaucoup penser au phénomène de décohérence quantique.

Monty Hall

Il s’agit jeu télévisé avec trois portes, dont voici les règles :

  • Derrière chacune des trois portes se trouve soit une chèvre, soit une voiture, mais une seule porte donne sur une voiture alors que deux portes donnent sur une chèvre. La porte cachant la voiture a été choisie par tirage au sort.
  • Le joueur choisit une des portes, sans que toutefois ce qui se cache derrière (chèvre ou voiture) ne soit révélé à ce stade.
  • Le présentateur sait ce qu’il y a derrière chaque porte.
  • Le présentateur doit ouvrir l’une des deux portes restantes et doit proposer au candidat la possibilité de changer de choix quant à la porte à ouvrir définitivement.
  • Le présentateur ouvrira toujours une porte derrière laquelle se cache une chèvre, en effet :
    • Si le joueur choisit une porte derrière laquelle se trouve une chèvre, le présentateur ouvrira l’autre porte où il sait que se trouve également une chèvre.
    • Si le joueur choisit la porte cachant la voiture, le présentateur choisit au hasard parmi les deux portes cachant une chèvre. (on peut supposer qu’un tirage au sort avant l’émission a décidé si ce serait la plus à droite ou à gauche)
  • Le présentateur doit offrir la possibilité au candidat de rester sur son choix initial ou bien de revenir dessus et d’ouvrir la porte qui n’a été choisie ni par lui-même, ni par le candidat.

La question qui se pose alors est :

Le joueur augmente-t-il ses chances de gagner la voiture en changeant son choix initial ?

Vu qu’il reste deux portes, nous pourrions nous dire que garder son choix initial ou le changer n’a pas d’incidence sur les probabilités. Ce qui évidemment est faux (sinon nous n’en parlerions pas). En réalité, il a une probabilité de 1/3 de gagner s’il conserve son choix initial et 2/3 s’il en change.

Lors de son choix initial, le joueur a une chance sur trois de sélectionner la porte gagnante. S’il décide de toujours garder sa porte, il a donc une chance sur trois de gagner. Comme à la fin il n’a que deux choix (garder ou changer), il aurait eu deux chances sur trois de gagner en changeant de porte.

Pour mieux comprendre, généralisons le principe du jeu :

La réponse devient évidente, non ?

Si vous n’êtes pas convaincus, développeur et que vous connaissez la loi des grands nombres, ce programme devrait vous aider :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
  int i, winning, choice, elim, change;
  int keepwin = 0, changewin = 0;

  /* Initialise le seed pour la génération aléatoire */
  srand(time(NULL));

  for (i = 0; i < 10000; i++) {
    /* Tire au sort une porte gagnante et un choix du joueur */
    winning = rand() % 3;
    choice = rand() % 3;

    /* Présentateur */
    if (choice == winning)
      /* Choisit aléatoirement d'éliminer l'une des deux autres portes */
      elim = ~winning & (rand() % 2 + 1);
    else
      /* Désigne la porte restante perdante */
      elim = 3 - choice - winning;

    /* Compte les choix vainqueurs */
    change = 3 - choice - elim;
    keepwin += choice == winning;
    changewin += change == winning;
  }

  printf("Victoires en gardant son choix   : %d\n", keepwin);
  printf("Victoires en changeant son choix : %d\n", changewin);
  return 0;
}

Notez que rand() % 3 ne fournira pas une distribution strictement uniforme (3 n’étant pas une puissance de 2), mais la précision nous suffira ici.

Ce problème est similaire au paradoxe des prisonniers.

Variante

Changeons un peu les règles : maintenant, le présentateur ne sait pas où se trouve la porte gagnante.

Du coup, une fois que le joueur a choisi sa porte, le présentateur indique une porte au hasard parmi les deux restantes. Si malheureusement il tombe sur la porte gagnante, la partie est annulée et on recommence.

Ainsi nous retirons toutes les parties où le présentateur a ouvert la porte gagnante. Il ne reste donc plus que les parties où il désigne une porte perdante, et nous nous retrouvons dans le même cas que précédement.

Eh bien, en fait, non. Ce n’est pas le même cas que précédemment, car maintenant le joueur va gagner avec un probabilité est de 1/2 qu’il garde sa porte ou qu’il en change. La preuve :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
  int i = 0, winning, choice, elim, change;
  int keepwin = 0, changewin = 0;

  /* Initialise le seed pour la génération aléatoire */
  srand(time(NULL));

  while (i < 10000) {
    /* Tire au sort une porte gagnante et un choix du joueur */
    winning = rand() % 3;
    choice = rand() % 3;

    /* Présentateur */
    elim = ~choice & (rand() % 2 + 1);
    if (elim == winning)
      continue;

    /* Compte les choix vainqueurs */
    change = 3 - choice - elim;
    keepwin += choice == winning;
    changewin += change == winning;
    i++;
  }

  printf("Victoires en gardant son choix   : %d\n", keepwin);
  printf("Victoires en changeant son choix : %d\n", changewin);
  return 0;
}

Intuitivement, si c’est le hasard qui détermine à la fois la porte choisie par le joueur et la porte laissée par le présentateur, et que nous supprimons toutes les parties où le présentateur a éliminé la porte gagnante (en moyenne 1 partie sur 3), tout se passe comme s’il n’y avait que 2 portes dès le début du jeu.

Dissonance

– “sonance”

Nous disposons de pastilles de 3 couleurs (disons rouge, bleu et vert).

Nous proposons à un singe de choisir parmi 2 de ces couleurs (par exemple rouge et bleu) celle qu’il préfère (par une méthode quelconque). Il répondrouge”.

Nous lui demandons alors laquelle il préfère parmi la couleur qu’il n’a pas choisie la première fois (bleu) et celle qui reste (vert). Et le plus souvent (environ 2 fois sur 3), les chercheurs ont observé qu’il rejetait encore la couleur qu’il n’avait pas choisie la première fois (bleu).

Cela montre qu’une fois que nous rejetons quelque chose, nous le dévaluons, ce qui nous amène à le rejeter de nouveau lors d’un second choix.

Ou pas. En réalité, ce raisonnement souffre de la même erreur de raisonnement qui nous induit en erreur dans le problème de Monty Hall.

Supposons que le singe sache trier les trois couleurs par ordre de préférence. Nous lui en montrons deux. Cela revient à choisir au premier tour celle que nous ne lui montrons pas.

Cette couleur non choisie peut être :

  1. celle que le singe préfère ;
  2. la deuxième ;
  3. celle qu’il aime le moins.

Parmi ces 3 possibilités équiprobables, seule la position 3 lui fera la rejeter lors du second choix (c’est la seule moins bonne que la moins bonne du premier choix).

Test positif

Une maladie X touche 1 personne sur 100 000 dans une population. Un test de la maladie X est fiable à 99%. Il se révèle positif pour vous. Quelle est la probabilité que vous soyez infecté ?

Aussi surprenant que cela puisse paraître, la réponse est 0,1%.

Faisons le calcul sur une population de 10 millions de personnes. La maladie touche 1 personne sur 100 000, donc 100 personnes en moyenne.

Le test est fiable à 99%, donc il provoque 1% d’erreur. Sur les 9 999 900 personnes non malades, il y a donc 99 999 erreurs (faux-positifs). Sur les 100 malades, il y a 1 erreur (faux-négatif).

En tout, en moyenne 99 999 + 99 = 100 098 personnes seront testées positives, alors que seules 99 seront malades. Donc si votre test est positif, vous avez 99 chances sur 100 098 d’être malade, soit moins de 0,1%.

Le fait que ce résultat soit surprenant pour notre cerveau provient d’un biais cognitif appelé l’oubli de la fréquence de base.

Conclusion

Méfiez-vous de vos intuitions en probabilités.

Formater du code C avec indent et Vim

jeudi 15 novembre 2012 à 13:23

Pour suivre des règles de codage et s’y tenir, rien de tel qu’un outil qui formate automatiquement le code (c’est plus rapide et sans erreurs). Sous Eclipse par exemple, la combinaison de touches Ctrl+Shift+F est indispensable. Mon but est d’obtenir la même fonctionnalité sous Vim pour le langage C.

indent

L’outil indent permet de formater un source C selon des règles définies par des paramètres en ligne de commande. Ces options sont très nombreuses. Heureusement, il y a quelques styles bien connus prédéfinis, comme le style K&R (option -kr).

Pour illustrer son fonctionnement, voici un code source écrit n’importe comment (et qui fait n’importe quoi) :

#include <stdio.h>

void f (  int* x  )
  {
 *x=4;}

void g(int x)
{goto mylabel;
        /* my comment */
    if(x>10)x=10;
       mylabel:
    printf ("%d\n",x *2);
switch(x){case 1:x=4;break;case 2:x=1;}
    while   ( * ( &x ) <10)x++; /* what? */
}

void h(char ( * ( * x ( ) ) [ ] ) ( ) ) {
char ( * ( * y ) [ ] ) ( ) = \
x ( ) ; char ( * z ) ( ) = * \
( * y ) ; char c = z ( ); putchar \
(c);
}

int main(){
int i=  2;  f(&i);
  g(i);

        return    0;
}

Pour formater :

indent -st -kr -ts4 file.c

Voici le résultat :

#include <stdio.h>

void f(int *x)
{
    *x = 4;
}

void g(int x)
{
    goto mylabel;
    /* my comment */
    if (x > 10)
        x = 10;
  mylabel:
    printf("%d\n", x * 2);
    switch (x) {
    case 1:
        x = 4;
        break;
    case 2:
        x = 1;
    }
    while (*(&x) < 10)
        x++;                    /* what? */
}

void h(char (*(*x())[])())
{
    char (*(*y)[]) () = x();
    char (*z) () = *(*y);
    char c = z();
    putchar(c);
}

int main()
{
    int i = 2;
    f(&i);
    g(i);

    return 0;
}

C’est plus joli, non ?

vim

Pour pouvoir reformater directement dans Vim, il suffit d’ajouter dans ~/.vimrc la ligne suivante :

autocmd BufNewFile,BufRead *.c set formatprg=indent\ -kr\ -ts4

Ensuite, la commande gq formate (u annule).

Par exemple, sur le fichier source malformaté ci-dessus :

Ainsi, seule la fonction g est formatée.

À partir de la ligne 7, le même résultat est obtenu en tapant directement gq8j (descendre de 8 lignes) ou gq15G (jusqu’à la ligne 15).

Pour reformater un bloc, le plus simple est de se placer sur une accolade { ou } et de taper gq% (% navigue entre les {}, () et [] ouvrant et fermant).

Pour reformater tout le fichier, il faut taper gggqG :

:wq

Formater du code C avec indent et Vim

jeudi 15 novembre 2012 à 12:23

Pour suivre des règles de codage et s’y tenir, rien de tel qu’un outil qui formate automatiquement le code (c’est plus rapide et sans erreurs). Sous Eclipse par exemple, la combinaison de touches Ctrl+Shift+F est indispensable. Mon but est d’obtenir la même fonctionnalité sous Vim pour le langage C.

Indent

L’outil indent permet de formater un source C selon des règles définies par des paramètres en ligne de commande. Ces options sont très nombreuses. Heureusement, il y a quelques styles bien connus prédéfinis, comme le style K&R (option -kr).

Pour illustrer son fonctionnement, voici un code source écrit n’importe comment (et qui fait n’importe quoi) :

#include <stdio.h>

void f (  int* x  )
  {
 *x=4;}

void g(int x)
{goto mylabel;
        /* my comment */
    if(x>10)x=10;
       mylabel:
    printf ("%d\n",x *2);
switch(x){case 1:x=4;break;case 2:x=1;}
    while   ( * ( &x ) <10)x++; /* what? */
}

void h(char ( * ( * x ( ) ) [ ] ) ( ) ) {
char ( * ( * y ) [ ] ) ( ) = \
x ( ) ; char ( * z ) ( ) = * \
( * y ) ; char c = z ( ); putchar \
(c);
}

int main(){
int i=  2;  f(&i);
  g(i);

        return    0;
}

Pour formater :

indent -st -kr -ts4 file.c

Voici le résultat :

#include <stdio.h>

void f(int *x)
{
    *x = 4;
}

void g(int x)
{
    goto mylabel;
    /* my comment */
    if (x > 10)
        x = 10;
  mylabel:
    printf("%d\n", x * 2);
    switch (x) {
    case 1:
        x = 4;
        break;
    case 2:
        x = 1;
    }
    while (*(&x) < 10)
        x++;                    /* what? */
}

void h(char (*(*x())[])())
{
    char (*(*y)[]) () = x();
    char (*z) () = *(*y);
    char c = z();
    putchar(c);
}

int main()
{
    int i = 2;
    f(&i);
    g(i);

    return 0;
}

C’est plus joli, non ?

vim

Pour pouvoir reformater directement dans Vim, il suffit d’ajouter dans ~/.vimrc la ligne suivante :

autocmd BufNewFile,BufRead *.c set formatprg=indent\ -kr\ -ts4

Ensuite, la commande gq formate (u annule).

Par exemple, sur le fichier source mal formaté ci-dessus :

Ainsi, seule la fonction g est formatée.

À partir de la ligne 7, le même résultat est obtenu en tapant directement gq8j (descendre de 8 lignes) ou gq15G (jusqu’à la ligne 15).

Pour reformater un bloc, le plus simple est de se placer sur une accolade { ou } et de taper gq% (% navigue entre les {}, () et [] ouvrant et fermant).

Pour reformater tout le fichier, il faut taper gggqG :

:wq

Free Mobile n'est pas neutre

mercredi 17 octobre 2012 à 10:49

Intrigué par le rapport d’un utilisateur sur RespectMyNet (qu’il présente en détail), j’ai voulu vérifier par moi-même.

Sur un serveur hébergé chez moi sur une ligne Free ADSL (maximum ~120Ko/s en upload), je crée un fichier totalement aléatoire dans un répertoire accessible en HTTP, avec plusieurs extensions :

# crée un fichier de 2Mio
dd if=/dev/urandom of=random count=4000
# crée plusieurs liens avec des extensions différentes
for ext in avi ogg oga webm pdf mp4 mov; do ln -s random{,.$ext}; done

Sur mon téléphone avec Android 4.11, connecté au réseau Free Mobile (sur une antenne d’Orange), je partage la connexion avec mon PC (Paramètres, Connexion, Sans fil et réseaux, Plus…, Partage de connexion, Via USB). Avec mon PC (sous Debian testing), je m’y connecte.

Je télécharge alors chacun des fichiers :

for ext in avi ogg oga webm pdf mp4 mov; do wget monserveur/random.$ext; done

Le résultat est sans appel.

Pour les fichiers portant l’extension .avi, .ogg, .mp4, .mov (et sans doute d’autres), le débit ne dépasse pas 5Ko/s et est même souvent en dessous d’1Ko/s :

requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 2048000 (2,0M) [video/x-msvideo]
Sauvegarde en : «random.avi»

 1% [                                       ] 34 486       757B/s  eta 43m 6s 

Par contre, pour les fichiers portant l’extension .oga, .webm, et .pdf, ça fonctionne parfaitement :

requête HTTP transmise, en attente de la réponse...200 OK
Longueur: 2048000 (2,0M) [audio/ogg]
Sauvegarde en : «random.oga»

27% [=========>                             ] 570 300      104K/s  eta 14s    

Cette limite ne vient pas de ma ligne Free ADSL (qui fonctionne parfaitement par ailleurs). Free Mobile filtre donc les fichiers sur HTTP en fonction de leur extension.

Il reste à vérifier si cela se produit aussi sur une antenne Free (mais je n’en capte jamais).

EDIT : Le problème ne se produit que sur une antenne Orange ; sur une antenne Free, ça fonctionne normalement.

Error happened! 0 - Call to undefined function simplexml_load_string() In: /var/www/Projet-Autoblog/autoblogs/autoblog.php:364 http://www.couturat.fr/Projet-Autoblog/autoblogs/blogrom1vcom_4af8d17d34d978843ff2ff40339aa5760e6458bc/?10 #0 /var/www/Projet-Autoblog/autoblogs/autoblog.php(932): VroumVroum_Blog->update() #1 /var/www/Projet-Autoblog/autoblogs/blogrom1vcom_4af8d17d34d978843ff2ff40339aa5760e6458bc/index.php(1): require_once('/var/www/Projet...') #2 {main}