mathpaqs_20230121.0.0_773568e5/probas/porscherie.adb

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
-- `Le moment est solennel pour vous; vous participez au c\'el\`ebre jeu`
-- `t\'el\'evis\'e \og Tiroir, mon beau tiroir, qu'est-ce ? \fg.`

-- `L'animateur-vedette Patrick Sandentier vous pr\'esente trois tiroirs`
-- `ferm\'es. L'un d'eux contient le titre de propri\'et\'e de la Porsche 911`
-- `de vos r\^eves, les deux autres sont vides. Au hasard, vous d\'esignez un`
-- `des tiroirs, sans l'ouvrir. L'animateur (qui sait, lui, quel est le bon`
-- `tiroir) vous soumet alors \`a une petite \'epreuve cruelle: il ouvre un`
-- `des deux autres tiroirs, vous montre qu'il est bien vide, et vous demande`
-- `si vous d\'esirez modifier votre choix.`

-- `Que r\'epondez-vous?`

with Ada.Text_IO;                       use Ada.Text_IO;
with Ada.Integer_Text_IO;               use Ada.Integer_Text_IO;
with Ada.Float_Text_IO;                 use Ada.Float_Text_IO;
with Ada.Numerics.Float_Random;         use Ada.Numerics.Float_Random;

procedure Porscherie is

  G: Generator;

  function Pos_random( p: positive ) return positive is
  begin
    return 1 + Integer( Random(G) * Float(p) ) mod p;
  end;

  function Pile_Face return boolean is
  begin
    return Pos_random( 2 ) = 1;
  end;

  type strategie is ( garder, tirer_au_sort, changer );

  function Gagne_jeu_Porsche( s: strategie ) return boolean is
    choix_1, porsche: positive;
  begin
    porsche:= Pos_random(3);   -- _Le_ tiroir a la Porsche
    choix_1:= Pos_random(3);   --  1er choix du joueur

    if choix_1 = porsche then
    
      -- Il est tombe sur la Porsche (1er choix)
      -- ---> Sandentier retire un des deux tiroirs vides
    
      case s is
        when garder        => return True;      -- Il garde la Porsche
        when tirer_au_sort => return Pile_Face; -- C'est comme pile ou face
        when changer       => return False;     -- Il perd la Porsche
      end case;

    else

      -- Il n'est pas tombe sur la Porsche (1er choix)
      -- ---> Sandentier retire l'autre tiroir vide

      case s is
        when garder        => return False;     -- Il ne gagne pas la Porsche
        when tirer_au_sort => return Pile_Face; -- C'est comme pile ou face
        when changer       => return True;      -- Il gagne la Porsche
      end case;
      
    end if;
  end;

  essais: natural:= 10;
  gagnes: natural;

begin
  Reset(G);
  
  boucle_nb_essais: for log10 in 1..6 loop
  
    boucle_strategies: for s in strategie loop
    
      gagnes:= 0;
  
      for e in 1..essais loop
       
        if Gagne_jeu_Porsche( s ) then
          gagnes:= gagnes + 1;
        end if;
        
      end loop;
      
      Put( gagnes ); Put(" / "); Put( essais );
      Put( 100.0*float(gagnes)/float(essais), 8,2,0 );
      Put_Line( " %    " & strategie'image(s) );
      
    end loop boucle_strategies;
    
    New_Line;

    essais:= essais * 10;

  end loop boucle_nb_essais;

end Porscherie;