Einzelnen Beitrag anzeigen
Alt 22.12.09, 02:07   #28 (permalink)
Chris_XY
 
Benutzerbild von Chris_XY
 
Registriert seit: 01.07.05
Chris_XY Leistung: Z3
Likes: 3
Standard

Ada.

Ich habe versucht, es einigermaßen schön hinzubekommen. Ich denke, es ist nicht ganz misslungen.

Die Zufallszahlen bei Ada sucken aber auch. Ich habe extra eine kleine Ausgabe am Ende eingebaut. Nach 140 Milliarden Versuchen habe ich auch abgebrochen, ich denke, da kommt nichts mehr.
Für 5 Richtige geht aber noch was: (252624, 94748, 54495, 252521, 15794 <= Sieht nach guten Zahlen aus)
Deshalb habe ich die Kalkulation der Chance auch gelassen, weil es dazu sowieso nie kommt.

   
Code:
with Ada.Text_IO, Ada.Integer_Text_IO;
with Ada.Numerics.Discrete_Random;

procedure Lotto is

   type Lottoarray is array (1 .. 6) of Positive;
   type Gewinnarray is array (1 .. 6) of Boolean;

   Tipps : Lottoarray;
   Ziehung : Lottoarray;
   Richtige : Gewinnarray;
   Anzahl_Richtige : Natural := 0;
   Neue_Ziehungen : Lottoarray;
   Counter : Natural := 0;

   subtype Rand_Range is Integer range 1 .. 49;
   package RDM is new Ada.Numerics.Discrete_Random (Rand_Range);
   Rdmgen : RDM.Generator;

   function Suche_Richtige
     (Tipps : Lottoarray;
      Ziehung : Lottoarray)
   return Gewinnarray;

   function Suche_Richtige
     (Tipps : Lottoarray; Ziehung : Lottoarray) return Gewinnarray
   is
      Richtige : Gewinnarray := (others => False);
   begin
      for Zaehler1 in Lottoarray'Range loop
         for Zaehler2 in Lottoarray'Range loop
            if Tipps (Zaehler1) = Ziehung (Zaehler2) then
               Richtige (Zaehler2) := True;
            end if;
         end loop;
      end loop;
      return Richtige;
   end Suche_Richtige;

begin

   for Zaehler in Tipps'Range loop
      Ada.Text_IO.Put ("Gib die Zahl Nr. " & Integer'Image (Zaehler) &
        " ein: ");
      Ada.Integer_Text_IO.Get (Tipps (Zaehler));
   end loop;
   Ada.Text_IO.New_Line;
   RDM.Reset (Rdmgen);
   Ziehung := (others => RDM.Random (Rdmgen));

   for Zaehler in Ziehung'Range loop
      Ada.Text_IO.Put ("Ziehung Zahl Nummer" & Integer'Image (Zaehler) &
       ": " & Integer'Image (Ziehung (Zaehler)));
      Ada.Text_IO.New_Line;
   end loop;
   Ada.Text_IO.New_Line;

   Richtige := Suche_Richtige (Tipps, Ziehung);

   for Zaehler in Richtige'Range loop
      if Richtige (Zaehler) then
         Anzahl_Richtige := Anzahl_Richtige + 1;
         Ada.Text_IO.Put ("Richtiger Tipp: " &
           Integer'Image (Ziehung (Zaehler)));
      end if;
   end loop;
   Ada.Text_IO.New_Line;

   Ada.Text_IO.Put ("Du hast" & Integer'Image (Anzahl_Richtige) &
     " Richtige");
   Ada.Text_IO.New_Line;

   while Anzahl_Richtige <= 6 loop
      Neue_Ziehungen := (others => RDM.Random (Rdmgen));
      Anzahl_Richtige := 0;
      Richtige := Suche_Richtige (Tipps, Neue_Ziehungen);
      for Zaehler in Richtige'Range loop
         if Richtige (Zaehler) then
            Anzahl_Richtige := Anzahl_Richtige + 1;
         end if;
      end loop;

      Counter := Counter + 1;
      if Counter mod 10000000 = 0 then
         Ada.Text_IO.Put_Line ("Schon" & Integer'Image (Counter/1000000) &
           " Milliarden Versuche");
      end if;
   end loop;

   Ada.Text_IO.New_Line;
   Ada.Text_IO.Put ("Du hast" & Integer'Image (Counter) &
     " Versuche gebraucht, um 6 Richtige zu bekommen!");
end Lotto;
__________________
The only true thing about religion is
that it's false.
Chris_XY ist offline   Mit Zitat antworten
 

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