Zufallsgenerator

Hoi

Ich bin jetzt mal von den simplen konsolenanwendungen zu richtigen, Fenstern übergegangen. Ich habe mich da jetzt auch schon ganz gut eingearbeitet, und wollte jetzt mal etwas machen:

ich habe einen Button und viele Labels erstellt, und wenn ich auf ´diesen Button klicke, sollen per Zufall die Labels mit schon vorher festgelegten Namen gefüllt werden ( immer ein Name pro Label).
Also zum Bsp. 18 Labels und 18 Namen. Jeder Name darf nur einmal im ganzen ausgegeben werden.

Ich´hab zwar schon ein bisle mit random und randomize rumexperimentiert, aber mehr als Zahlen und Muster per zufall ausgeben kann ich dann doch nit :wink: Wäre cool wenn ihr mir hier mal helfen könntet :smile: Danke

Mfg Thunder-86

Eigentlich müsste der Code klappen,
aber irgendwo ist trotzdem der Hund
begraben. Es kommt irgendsone Zugriffs-
verletzung. Ich hab jetzt aber auch
keine Zeit und Lust, den Fehler zu suchen.
Das können ja andere machen.
Vielleicht gibt es dir ja den entscheidenen
Denkansatz:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;
namen: array of string;
benutzt: array of integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
zufallszahl: integer;
schleifenvar: boolean;
begin
schleifenvar:=true;
namen[1]:=‚Roman‘;
namen[2]:=‚Ewert‘;
namen[3]:=‚usw.‘;
namen[4]:='Kalle ';
namen[5]:=‚Pohl‘;
namen[6]:=‚Kurt‘;
namen[7]:=‚Jürgens‘;
namen[8]:=‚Udo‘;
namen[9]:=‚Lindenberg‘;
namen[10]:=‚Heim‘;
namen[11]:=‚Arbeit‘;
namen[12]:=‚Michael‘;
namen[13]:=‚Schumacher‘;
namen[14]:=‚Rudi‘;
namen[15]:='Carell ';
namen[16]:=‚Christoph‘;
namen[17]:=‚Maus‘;
namen[18]:=‚und so fort…‘;

for i:=1 to 18 do
begin
while (schleifenvar) do
begin
randomize;
zufallszahl:=Round(Random(18));
end;
if i=1 then label1.caption:=namen[zufallszahl];
if i=2 then label2.caption:=namen[zufallszahl];
if i=3 then label3.caption:=namen[zufallszahl];
if i=4 then label4.caption:=namen[zufallszahl];
if i=5 then label5.caption:=namen[zufallszahl];
if i=6 then label6.caption:=namen[zufallszahl];
if i=7 then label7.caption:=namen[zufallszahl];
if i=8 then label8.caption:=namen[zufallszahl];
if i=9 then label9.caption:=namen[zufallszahl];
if i=10 then label10.caption:=namen[zufallszahl];
if i=11 then label11.caption:=namen[zufallszahl];
if i=12 then label12.caption:=namen[zufallszahl];;
if i=13 then label13.caption:=namen[zufallszahl];
if i=14 then label14.caption:=namen[zufallszahl];
if i=15 then label15.caption:=namen[zufallszahl];
if i=16 then label16.caption:=namen[zufallszahl];
if i=17 then label17.caption:=namen[zufallszahl];
if i=18 then label18.caption:=namen[zufallszahl];
benutzt[zufallszahl]:=1;
if benutzt[zufallszahl]1 then schleifenvar:=false;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
setlength(benutzt,18);
setlength(namen,18);

for i:=1 to 18 do
begin
benutzt[i]:=0;
end;
end;

end.

nun ja…
Hallo,

da sind aber ein paar Macken im Code!

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;
namen: array of string;
benutzt: array of integer;

besser Array[1…18] of Boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
zufallszahl: integer;
schleifenvar: boolean;
begin
schleifenvar:=true;
namen[1]:=‚Roman‘;
namen[2]:=‚Ewert‘;
namen[3]:=‚usw.‘;
namen[4]:='Kalle ';
namen[5]:=‚Pohl‘;
namen[6]:=‚Kurt‘;
namen[7]:=‚Jürgens‘;
namen[8]:=‚Udo‘;
namen[9]:=‚Lindenberg‘;
namen[10]:=‚Heim‘;
namen[11]:=‚Arbeit‘;
namen[12]:=‚Michael‘;
namen[13]:=‚Schumacher‘;
namen[14]:=‚Rudi‘;
namen[15]:='Carell ';
namen[16]:=‚Christoph‘;
namen[17]:=‚Maus‘;
namen[18]:=‚und so fort…‘;

for i:=1 to 18 do
begin
while (schleifenvar) do
begin
randomize;
zufallszahl:=Round(Random(18));

Zufallszahl := Random(18) + 1;
sonst gehts von 0 bis 17!
Random (MyInt) gibt bereits Integer-Werte aus.

end;
if i=1 then label1.caption:=namen[zufallszahl];
if i=2 then label2.caption:=namen[zufallszahl];
if i=3 then label3.caption:=namen[zufallszahl];
if i=4 then label4.caption:=namen[zufallszahl];
if i=5 then label5.caption:=namen[zufallszahl];
if i=6 then label6.caption:=namen[zufallszahl];
if i=7 then label7.caption:=namen[zufallszahl];
if i=8 then label8.caption:=namen[zufallszahl];
if i=9 then label9.caption:=namen[zufallszahl];
if i=10 then label10.caption:=namen[zufallszahl];
if i=11 then label11.caption:=namen[zufallszahl];
if i=12 then label12.caption:=namen[zufallszahl];;
if i=13 then label13.caption:=namen[zufallszahl];
if i=14 then label14.caption:=namen[zufallszahl];
if i=15 then label15.caption:=namen[zufallszahl];
if i=16 then label16.caption:=namen[zufallszahl];
if i=17 then label17.caption:=namen[zufallszahl];
if i=18 then label18.caption:=namen[zufallszahl];

benutzt[zufallszahl]:=1;
if benutzt[zufallszahl]1 then schleifenvar:=false;

So wie du das machst, ist benutzt[z] immer 1!
Die Abfrage gehört an den Anfang der Schleife (in die while-Schleife).

end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
setlength(benutzt,18);
setlength(namen,18);

Wozu dynamische Arrays, wenn die Arraylänge sowieso festliegt?

for i:=1 to 18 do
begin
benutzt[i]:=0;
end;
end;

end.

Soweit mal.

Gruss, Niels

Hi

Danke für den Code :wink: ich habe mal den ersten und dann nochmal den zweiten, von Niels leicht korrigierten, Code reinkopiert. Nur leider funzen bei nit so. Bei dem ursprünglichen stürtzt er mit ner statten Fehlermeldung ab ( wenn ich auf den Button klicke ). Und beim dem von Niels, bleibt mir das ganze Programm hängen. :frowning:

Hmm, geht der Code denn bei euch ?

Hi Thunder-86,

hier, so sieht es aus, wenn man es „professionell“ macht:

unit Form\_1;
~
~
interface
~
~
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls;
~
~
CONST NSTADT = 8;
~
~
TYPE
 TButtonStadt
 = CLASS(TButton)
 PROCEDURE Init (k\_: INTEGER);
 END;
~
~
 TStadtButtonArray
 = CLASS
 Button: ARRAY[0..NSTADT-1] OF TButtonStadt;
~
 CONSTRUCTOR Create;
 DESTRUCTOR Destroy; OVERRIDE;
 END;
~
~
 TForm1
 = class(TForm)
 procedure FormCreate (Sender: TObject);
 procedure FormDestroy(Sender: TObject);
~
 private
 a : ARRAY[0..NSTADT-1] OF INTEGER;
 StadtButtonArray: TStadtButtonArray;
~
 PROCEDURE FillPermutationArray;
~
 PROCEDURE ButtonStadtClick (Sender: TObject);
~
 end;
~
~
VAR
 Form1: TForm1;
~
~
//\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
~
IMPLEMENTATION
~
~
{$R \*.DFM}
~
~
CONST
 STADTNAME:
 ARRAY[0..NSTADT-1] OF STRING
 = ('Toronto',
 'San Francisco',
 'Boston',
 'Chicago',
 'Philadelphia',
 'Miami',
 'Phoenix',
 'Detroit');
~
~
//\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
~
PROCEDURE TButtonStadt.Init (k\_: INTEGER);
~
begin
 Parent := Form1;
 Tag := k\_;
 SetBounds(50, 50+30\*k\_, 100, 23);
 Caption := STADTNAME[Form1.a[k\_]];
 OnClick := Form1.ButtonStadtClick
end;
~
~
//\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
~
CONSTRUCTOR TStadtButtonArray.Create;
~
VAR k: INTEGER;
~
begin
 FOR k := 0 TO NSTADT-1 DO
 begin
 Button[k] := TButtonStadt.Create(Form1);
 Button[k].Init(k)
 end
end;
~
~
~
DESTRUCTOR TStadtButtonArray.Destroy;
~
VAR k: INTEGER;
~
begin
 FOR k := 0 TO NSTADT-1 DO
 begin
 Button[k].Destroy
 end
end;
~
~
//\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
~
PROCEDURE TForm1.FormCreate(Sender: TObject);
~
begin
 Randomize;
 FillPermutationArray;
 StadtButtonArray := TStadtButtonArray.Create;
end;
~
~
~
PROCEDURE TForm1.FormDestroy (Sender: TObject);
~
begin
 StadtButtonArray.Destroy;
end;
~
~
//\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
~
PROCEDURE TForm1.FillPermutationArray;
~
VAR
 h : ARRAY[0..NSTADT-1] OF INTEGER; // Hilfsfeld
 k : INTEGER;
 k0: INTEGER;
~
begin
 FOR k := 0 TO NSTADT-1 DO
 begin
 h[k] := k
 end;
~
 FOR k := 0 TO NSTADT-1 DO
 begin
 k0 := Random(NSTADT-k-1);
 a[k] := h[k0];
 h[k0] := h[NSTADT-k-1]
 end
end;
~
~
//\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
~
PROCEDURE TForm1.ButtonStadtClick (Sender: TObject);
~
VAR k: INTEGER;
~
begin
 k := TComponent(Sender).Tag;
 Caption := 'Button Nr. '+IntToStr(k+1)+' = '+STADTNAME[a[k]]
end;
~
~
END.

Vergiß nicht, mittels Objektinspektor die Formularereignisse „OnCreate“ und „OnDestroy“ zuzuweisen; sonst funktioniert die Sache nicht.

Ich habe nur 8 Städte implementiert. Wenn Du mehr haben willst, ändere die Konstante NSTADT entsprechend und erweitere das Array „STADTNAME“. Mehr mußt Du nicht machen.

Ich hoffe, Du kommst mit dem Code zurecht. Wenn Du Fragen dazu hast, stelle sie einfach hier.

Gruß
Martin

Hallo,

das liegt daran, dass ich nur zwei oder drei Stellen verbessert habe, die mir so ins Auge gefallen sind. Ich habe das jetzt mal ausprobiert und hier ist ein funktionierende Code, der auf dem Ausgangscode basiert:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;
namen: array of string;
benutzt: array of boolean;

implementation

{$R \*.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 zufallszahl: integer;
begin
namen[1]:='Roman';
namen[2]:='Ewert';
namen[3]:='usw.';
namen[4]:='Kalle ';
namen[5]:='Pohl';
namen[6]:='Kurt';
namen[7]:='Jürgens';
namen[8]:='Udo';
namen[9]:='Lindenberg';
namen[10]:='Heim';
namen[11]:='Arbeit';
namen[12]:='Michael';
namen[13]:='Schumacher';
namen[14]:='Rudi';
namen[15]:='Carell ';
namen[16]:='Christoph';
namen[17]:='Maus';
namen[18]:='und so fort...';

for i:=1 to 18 do
begin
 repeat
 zufallszahl:=Random(18) + 1; //nur so gehts von 1 bis 18
 until not benutzt[zufallszahl];

 case i of
 1 : label1.caption:=namen[zufallszahl];
 2 : label2.caption:=namen[zufallszahl];
 3 : label3.caption:=namen[zufallszahl];
 4 : label4.caption:=namen[zufallszahl];
 5 : label5.caption:=namen[zufallszahl];
 6 : label6.caption:=namen[zufallszahl];
 7 : label7.caption:=namen[zufallszahl];
 8 : label8.caption:=namen[zufallszahl];
 9 : label9.caption:=namen[zufallszahl];
 10: label10.caption:=namen[zufallszahl];
 11: label11.caption:=namen[zufallszahl];
 12: label12.caption:=namen[zufallszahl];
 13: label13.caption:=namen[zufallszahl];
 14: label14.caption:=namen[zufallszahl];
 15: label15.caption:=namen[zufallszahl];
 16: label16.caption:=namen[zufallszahl];
 17: label17.caption:=namen[zufallszahl];
 18: label18.caption:=namen[zufallszahl];
 end;
 benutzt[zufallszahl] := true;
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;

begin
setlength(benutzt,19); //Array geht dann von 0 bis 18;
setlength(namen,19);

for i:=1 to 18 do
begin
benutzt[i]:= false;
end;
end;

end.

Es gibt sicher bessere Methoden. Die Labels würde ich zB dynamisch erzeugen. Aus deinem ersten Posting schließe ich aber, dass du eher am Anfang stehst. Deshalb wollte ich nicht mit Kanonen auf Spatzen schießen.

Gruss, Niels

Hi

Also ich ahe diesen Code jetzt eingefügt, und halt eben noch ein, zwei Labels wegen Überschrift uns so hinzugefügt und die nahmen für die Button und so geändert. es sollte alles klappen aber, wenn ich das Prog starte, und auf den Button drücken, kommt irgend so ne Fehlermeldung mit " Debugger Exception Notification ". Ich ahe wirklich alles korrekt umgeändert und eingefügt und ich bin mir sicher das es etwas mit diesem FormCreate zu tun hat. ( Also bei mir heisst es dementsprechend FormZufallsgenCreate )Muss ich noch irgendwas im Opject Inspektor einstellen oder so ??
Sry, wenn ich in der hinsicht ein bisle nerve, aber ich bekomms einfach nit gebacken…

Tschau

@ Niels: Am besten schickst du mir, einfach das komplette Programm, dann ändere ich einfach die namen die in den Labels angezeigt werden sollen und ich hab die garantie das es dann auch geht :wink:
Email: [email protected]

Tschau