unit sammlerbilderunit;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, TAGraph;

type

  { TForm1 }

  TForm1 = class(TForm)
    BilderproAlbum: TEdit;
    BilderproTuete: TEdit;
    Button1: TButton;
    Button2: TButton;
    Chart1: TChart;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    erg: TMemo;
    Simulationen: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

uses TASeries;

  { TForm1 }

procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
type
  Tsammeln = array of boolean;
var
  Bilder_Album, Bilder_Tuete, Simzahl: integer;
  Sammeln, Tuete: Tsammeln;
  Statistik: array of integer;
  Tuetenzahl, Gesamtzahl: integer;
  i, j: integer;
  Maxn, n: integer;

  procedure InitArray;
  var
    i: integer;
  begin
    for i := low(sammeln) to high(sammeln) do Sammeln[i] := False;
  end;

  function GetTuete: Tsammeln;
  var
    i, j, index: integer;
  begin
    Result := nil;
    setlength(Result, Bilder_Album);
    for i := 0 to Bilder_Album - 1 do Result[i] := False;
    for j := 1 to Bilder_Tuete do
    begin
      repeat
        index := random(Bilder_Album);
      until Result[index] = False;
      Result[index] := True;
    end;
  end;

  function AlleKarten: boolean;
  var
    i: integer;
  begin
    Result := False;
    for i := low(sammeln) to high(sammeln) do if not Sammeln[i] then exit;
    Result := True;
  end;

  procedure AusgabeChart;
  var
    Serie: TAreaSeries;
    i: integer;
  begin
    Chart1.Series.Clear;
    Serie := TAreaSeries.Create(self);
    for i := low(Statistik) to high(Statistik) do if Statistik[i] > 0 then
        Serie.addxy(i, Statistik[i]);
    Serie.SeriesColor:=clnavy;
    Chart1.AddSeries(Serie);
  end;

  procedure AusgabeMemo;
  var
    i: integer;
  begin
    erg.Lines.Clear;
    for i := low(Statistik) to high(Statistik) do if Statistik[i] > 0 then
        erg.Lines.Add(Format('%d Tüten: %d mal', [i, statistik[i]]));
    erg.Lines.add('');
    erg.Lines.add(Format('%d Bilder pro Album', [Bilder_Album]));
    erg.Lines.add(Format('%d Bilder pro Tüte', [Bilder_Tuete]));
    erg.Lines.add(Format('%d Simulationsdurchgänge', [Simzahl]));
    erg.Lines.add('');
    erg.Lines.add(Format('Im Mittel %.0f Tüten bis Album voll', [Gesamtzahl / simzahl]));
    erg.Lines.add(Format('Häufigster Wert: %d Tüten (%d-mal)', [n, Maxn]));
  end;

begin
  erg.Lines.Clear;
  Bilder_Album := StrToInt(BilderproAlbum.Text);
  Bilder_Tuete := StrToInt(BilderproTuete.Text);
  Simzahl := StrToInt(Simulationen.Text);
  statistik := nil;
  Sammeln := nil;
  setlength(statistik, simzahl);
  setlength(Sammeln, Bilder_Album);
  Gesamtzahl := 0;
  maxn := 0;
  Randomize;
  for i := 1 to simzahl do
  begin
    Tuetenzahl := 0;
    InitArray;
    repeat
      Tuete := gettuete;
      for j := low(Tuete) to high(Tuete) do
        if Tuete[j] then sammeln[j] := True;
      Tuetenzahl := Tuetenzahl + 1;
    until AlleKarten;
    Statistik[Tuetenzahl] := Statistik[Tuetenzahl] + 1;
    Gesamtzahl := Gesamtzahl + Tuetenzahl;
    if Statistik[Tuetenzahl] > maxn then
    begin
      maxn := Statistik[Tuetenzahl];
      n := Tuetenzahl;
    end;
    if (i mod 1000) = 0 then
    begin
      Caption := Format('Durchlauf Nr. %d', [i]);
      Application.ProcessMessages;
    end;
  end;
  AusgabeMemo;
  AusgabeChart;
end;

end.
