Einzelnen Beitrag anzeigen

pszopp

Registriert seit: 7. Sep 2005
Ort: Alsdorf
95 Beiträge
 
Delphi 2010 Professional
 
#3

Re: 3 Zufallszahlen ohne Wiederholung

  Alt 25. Mai 2006, 15:04
Hallo,

ich habe mal ein Formular mit dem nötigen Code erzeugt:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const
  // Zahlen von 1 bis 100 sind möglich.
  AnzahlZahlen = 100;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Label4: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    ZahlVerwendet : array[1..AnzahlZahlen] of boolean;
    AnzahlverwendeterZahlen : Integer;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var lk : Integer;
begin
  // Es wurden noch keine Zahlen gezogen
  AnzahlverwendeterZahlen := 0;

  // Stellt im Array für jede Zahl ein,
  // dass sie noch nicht gezogen wurde.
  for lk := 1 to AnzahlZahlen do begin
    ZahlVerwendet[lk] := False;
  end;

  Randomize;
end;


procedure TForm1.Button1Click(Sender: TObject);
var lk : Integer;
    li : Integer;
    Rnd : Integer;
    Cnt : Integer;
begin
  if ((AnzahlZahlen - AnzahlverwendeterZahlen) < 3) then begin
    MessageDlg('Es können keine Zufallszahlen mehr gezogen', mtInformation, [mbOK], 0);
    Exit;
  end;


  // drei Zahlen werden gezogen
  for lk := 1 to 3 do begin
    // Berechnet, welche Zahl als Zufalllszahl genommen werden soll.
    // Ist Rnd = 4 soll z.B. die vierte noch nicht verwendete Zahl
    // benutzt werden.
    Rnd := Random(AnzahlZahlen - AnzahlverwendeterZahlen) + 1;

    Cnt := 0;
    for li := 1 to AnzahlZahlen do begin
      if (not ZahlVerwendet[li]) then begin
        Inc(Cnt);
      end;

      if (Cnt = Rnd) then begin
        Rnd := li; // Dies ist die zufällige Zahl
        ZahlVerwendet[li] := True;
        break;
      end;
    end; // for li
    Inc(AnzahlverwendeterZahlen);

    // Trägt die Zufallszahl in ein Label ein.
    case lk of
      1: Label1.Caption := Format('%d', [Rnd]);
      2: Label2.Caption := Format('%d', [Rnd]);
      3: Label3.Caption := Format('%d', [Rnd]);
    end; // case

  end; // for lk

  Label4.Caption := Format('Anzahl verbleibender Züge: %d',
                      [(AnzahlZahlen - AnzahlverwendeterZahlen) DIV 3]);
end;

end.
Auf dem Formular müssen ein Button und vier Label liegen.


Viele Grüße,
pszopp
www.pstipp.de | Tippseite zur Formel 1 und Fußball WM/EM - kostenlos und Just-For-Fun
  Mit Zitat antworten Zitat