'Random (Menge)' machbar?

Hi,

kann Pascal oder Delphi aus einer Menge (integer oder byte) mit dem
„random“ ein Zufallszahl ziehen?

Bei mir gibts eine Fehlermeldung. Vielleicht mache ich etwas falsch.

kann Pascal oder Delphi aus einer Menge (integer oder byte)
mit dem

Ja.

Bei mir gibts eine Fehlermeldung. Vielleicht mache ich etwas
falsch.

Wie machst Du es denn? Welche Fehlermeldung?
Dass man Euch sowas immer aus der Nase ziehen muss …

Manfred

Hi.
Habe die Menge z deklariert und wollte über random daraus eine Zahl ziehen. Fehlermeldung lautet:

18 / 23 lotto4.pas Error: Incompatible type for arg no. 1: Got Set Of Byte, expected ULONG

Der Code unten ist komplett, also einfach mal als pas. Datei speichern und laufen lassen.

program Lotto;
uses crt;
var Zahl:array[1…6]of byte;
var n:byte;
var Z:set of 1…49;
var wahl:string;
label anfang,ende;

begin

anfang:
randomize;
Z:= [1…49];
clrscr;
for n:=1 to 6 do
begin
Zahl[n]:=random(Z)+1;
Z:=Z+[Zahl[n]];
write(Zahl[n]);

end;

gotoxy(3,7);
writeln('Nochmal? a ein ');
wahl:=readkey;
clrscr;
if (wahl=‚j‘) then goto anfang
else goto ende;

ende:
end.

Nochmal Hi,

Reinhard Kern hat Dir weiter unten schon die Antwort gegeben!

Das Problem bei der Sache ist, dass du eine gezogene Kugel nochmal ziehen könntest (dann ist das Element in der Menge leer). Das mußt du prüfen und solange weiterprobieren, bis du ein Element erwischst, was noch nicht gezogen wurde.

Statt Deinen goto’s solltest Du besser ordentliche Schleifen verwenden (Repeat oder While).

LG
Jochen

PS:

const
 Anz = 6;
var
 Urne: set of 1..49;
 Wahl: array[1..Anz] of Byte;
 i,Nr: integer;
 vorhanden: boolean;
begin
 Randomize;
 Urne := [1..49];
 for i := 1 to Anz do
 begin
 Repeat
 Nr := Random(49)+1;
 vorhanden := (Nr in Urne);
 if vorhanden then
 begin
 Wahl[i] := Nr;
 Urne := Urne - [Nr];
 end;
 until vorhanden;
 end;
end;

HI

Reinhard Kern hat Dir weiter unten schon die Antwort gegeben!

Das ist nicht die Lösung die ich finden wollte. Wollte es genauso wie in der Realität abhandeln, dass ein mehrmaliges ziehen erst gar nicht möglich ist.

Die goto’s bzw. labels find da eigentlich sehr passend weil ich nen readln drin habe und das Programm erstmal auf eine Eingabe wartet.

Hallo,

dir ist aber bekannt, dass die Verwendung von Goto zu den übelsten Programmierstilen gehört, weil der Code dadurch sehr unübersichtlich wird?.Dein Programm ließe sich mit einer einfachen repeat-until-Schleife deutlich übersichtlicher schreiben.

Die goto’s bzw. labels find da eigentlich sehr passend

Mindestens dieser Teil ist absolut unpassend:

if (wahl='j') then goto anfang
else goto ende;

ende:

Da solltest Du vielleicht nochmal drüber nachdenken. Solche Dinge passieren, wenn man gotos verwendet.

Gruß, Niels

Hallo,

Das ist nicht die Lösung die ich finden wollte. Wollte es
genauso wie in der Realität abhandeln, dass ein mehrmaliges
ziehen erst gar nicht möglich ist.

Ein Modell mit einer simulierten „echten Urne“ habe ich Dir auch schon gezeigt: die verkettete Liste, wo man gezogene Einträge aus der Liste entfernen kann. Sowas geht IMHO nicht mit Mengen. Bei einer Menge mußt Du immer erst nachsehen, ob ein zufällig ausgewähltes Element (noch) in der Menge drin ist oder nicht (mehr).

Solltest Du wider mein Wissen dennoch eine Lösung dafür finden, lass es mich wissen - das interessiert mich auch.

Die goto’s bzw. labels find da eigentlich sehr passend weil
ich nen readln drin habe und das Programm erstmal auf eine
Eingabe wartet.

Nee, das ist nie passend. Das ist einfach kein guter Stil. Du kannst ja gerne auf eine Eingabe warten, aber eben innerhalb einer Schleife, die in abhängigkeit der Antwort ggf. abgebrochen wird:

repeat
 # ziehe die Lottozahlen...
 # gib sie aus...
 writeLn("Nochmal (j/n)?");
 readLn(Antwort);
until (Antwort "j");

LG
Jochen

Ja. Ich werde über das Verwenden von labels nachdenken. Wofür sind die dann überhaupt gut?
Bei Delphi kann man doch mehrere Units (werden die so genannt?) nutzen. In jeder steht ein bestimmter Teil des Programmes. Aber das wird mir zu kompliziert.

Hi Jo

Mit verketteten Einträgen habe ich noch nie gearbeitet… :frowning: Find ich ziemlich kompliziert.

Solltest Du wider mein Wissen dennoch eine Lösung dafür
finden, lass es mich wissen - das interessiert mich auch.

Ich versuche es mal wie du sagst. Falls ich eine andere Lösung finde verkaufe ich sie an Microsoft oder IBM.

Nee, das ist nie passend. Das ist einfach kein guter Stil.

Jeder hackt immer auf den süßen Labels rum.