![]() |
Zufalsgenerator - Zahlen auslassen ?
Guten morgen zusammen
habe da mal ne Frage, wenn ich aus 10 Zufalszahlen nehme und nach jeder die gezogene Zahl aus dem Pool der 10 nehme. Also beim zweiten Durchgang eine zufalszahl aus 9 usw. diese Zahl die entfernt wird kann aber auch mitten drin sein also auch die 5, somit muss aus 10 aber ohne die 5! Hoffe ich habe es so erklärt das man es versteht! Habt ihr vorschläge ? THX Cyberbob |
Re: Zufalsgenerator - Zahlen auslassen ?
Delphi-Quellcode:
Dieser Code füllt dein Array Used mit 10 unterschiedlichen Zahlen zwischen 1 und 10.
var Used: array[1..10] of Integer; i, x, t: Integer;
begin Randomize; i := 1; while i <> 11 do begin t := Random(10)+1; for x := 1 to i do if Used[x] = t then Break; if x = i+1 then begin Used[x] := t; Inc(i); end; end; end; Beware: untested. |
Re: Zufalsgenerator - Zahlen auslassen ?
Werde ich mal ausprobieren! danke
dazu noch ne Frage : wird die 0 mitgenutzt ? |
Re: Zufalsgenerator - Zahlen auslassen ?
Nein. Random(10)+1 produziert Zahlen zwischen 1 und 10, wenn du das +1 wegnimmst, zwischen 0 und 9.
|
Re: Zufalsgenerator - Zahlen auslassen ?
Habe es nun versucht leider ist es eine entlosschleife. wenn ich mir den Inhalt des Arrays anzeigen lassen will kommt nur eine große Zahle so 328777777 oder so!
Delphi-Quellcode:
Var
V:integer; Used: array[1..10] of Integer; i: Integer; begin Randomize; i := 1; Showmessage(inttostr(ID.length)); while i <> ID.length do begin zahl:=Random(ID.length)+1; for V := 1 to i do Showmessage(inttostr(Used[V])); if Used[V] = zahl then Break; if V = i+1 then begin Used[V] := zahl; Inc(V); end; end; |
Re: Zufalsgenerator - Zahlen auslassen ?
Natürlich ist es eine Endlosschleife. Die Schleife läuft bis i = Id.Length ( <- was ist überhaupt ID ) ist. Du erhöhst aber nirgendwo den Wert von i. Also wird das nie zutreffen. Ausserdem würd ich nicht auf i <> id.length sondern auf i < id.length prüfen.
|
Re: Zufalsgenerator - Zahlen auslassen ?
Oh... so stimmts:
Delphi-Quellcode:
var Used: array[1..10] of Integer; i, x, t: Integer;
begin Randomize; i := 1; FillChar(Used[1], 10*sizeof(Uses[1]), 0); while i <> 11 do begin t := Random(10)+1; for x := 1 to i do if Used[x] = t then Break; if x = i+1 then begin Used[i] := t; Inc(i); end; end; end; |
Re: Zufalsgenerator - Zahlen auslassen ?
ID.length ist die Länge einer Liste.
Er soll also in der LIste zufällig eine Zeile finden! und diese nicht nocheinmal nehmen! |
Re: Zufalsgenerator - Zahlen auslassen ?
Habe es nun mit der Verbesserubg ausprobiert aber leider kommen immer noch welche Doppelt!
Bis zur 4ten Stelle passt das Array dann schreib er nix mehr rein! Soll ich euch das Programm mal hochladen ? Was ich noch nicht verstehe sind die Zeilen... FillChar(Used[1], 10, 0); used[1] := 9; BIG THX |
Re: Zufalsgenerator - Zahlen auslassen ?
:oops: Wie hat sich denn das 9-Assignement da eingeschlichen?
Aber du musst statt '10' schon die Länge des Arrays angeben, sonst funktionierts nicht. Das FillChar[...] leert das Array, es wird komplett mit Nullen gefüllt. |
Re: Zufalsgenerator - Zahlen auslassen ?
OK das 9te ist weg :-)
Leeren will ich das eigentlich nicht, nach dem ersten Durchgang soll er die Zahl schon behalten bis alle mal dran waren! |
Re: Zufalsgenerator - Zahlen auslassen ?
Dann leerst du das Array eben vor dem ersten Durchgang ... einen passenden Platz für das FillChar zu finden sollte ja nicht schwer sein. ;)
|
Re: Zufalsgenerator - Zahlen auslassen ?
Liste der Anhänge anzeigen (Anzahl: 2)
Leider funktioniert das mit dem Fillchar nicht richtig !
Siehe Bild! |
Re: Zufalsgenerator - Zahlen auslassen ?
Das verstehe ich nicht... Bei mir funktioniert es reibungslos.
|
Re: Zufalsgenerator - Zahlen auslassen ?
sorry irgentwie wollte das mit dem Bild nicht richtig ? hoffe es ist nun da!
|
Re: Zufalsgenerator - Zahlen auslassen ?
Es ist da, sogar doppelt... :gruebel:
|
Re: Zufalsgenerator - Zahlen auslassen ?
Bin heute morgen irgendwie geistig halb-abwesend... Jetzt sollte der Code aber stimmen.
Statt FillChar(Used[1], Len(Used), 0) schreibt man eher FillChar(Used[1], Len(Used)*sizef(Used[1]), 0), dann müsste alles funktionieren. |
Re: Zufalsgenerator - Zahlen auslassen ?
Ok habe Fillchar nun direkt am Anfang, dann macht er alle auf 0 nur wieso ?
Nun besteht immer noch das Problem das er mir Trotzdem Doppelte Zahlen angiebt! Wo kann ich am Besten eine Messagebox einfügen die mir alle zufalszahlen anzeigt! Habe eine direkt hinter der While schleife, daran lasse ich mir die Zahl aus Random anzeigen! |
Re: Zufalsgenerator - Zahlen auslassen ?
Delphi-Quellcode:
Undefinierter Bezeichner "Len" :(
FillChar(Used[1], Len(Used)*sizef(Used[1]), 0)
|
Re: Zufalsgenerator - Zahlen auslassen ?
Alle, auf 0, weil bei dir 0 nie vorkommt, und du wolltest doch astronomische Zahlen wie 2362734 vermeiden... Bei dir sähe der Showmessage-Code dann so aus:
Delphi-Quellcode:
var Used: array[1..10] of Integer; i, x, t: Integer;
begin Randomize; i := 1; FillChar(Used[1], 10*sizeof(Uses[1]), 0); while i <> 11 do begin t := Random(10)+1; for x := 1 to i do if Used[x] = t then Break; if x = i+1 then begin ShowMessage(IntToSTr(t)); Used[i] := t; Inc(i); end; end; end; |
Re: Zufalsgenerator - Zahlen auslassen ?
OK Super es läuft schonmal.
Beim Durchgehen lässt er den letzten aber immer aus! im Array bleibt 0 stehen. es kommen nur 9 von 10 Messages mit den Zahlen! |
Re: Zufalsgenerator - Zahlen auslassen ?
Dann liegt es an dir, der Code funktioniert bei mir perfekt, nirgends steht mehr 0 drin.
|
Re: Zufalsgenerator - Zahlen auslassen ?
Jo war auch mein Fehler,
musste ID.length noch +1 nehmen damit der letzte durchgang mitkommt! BESTEN DANK ERSTMAL FÜR DIE HILFE |
Re: Zufalsgenerator - Zahlen auslassen ?
Jaja, ziehe zufällig Zahlen aus 1 bis 10 ohne zurücklegen, das Thema hatten wir schon merhmals, es nennt sich Lotto-Ziehungen.
![]()
Delphi-Quellcode:
Gruß hagen
type
TZahlen = array of Integer; procedure Lotto(var Sortiert,Gezogene: TZahlen; Ziehungen: Integer = 6; Elemente: Integer = 49); var I,J,K,N: Integer; begin Sortiert := nil; // stellt sicher das Sortiert <> Gezogene ist Gezogene := nil; if Ziehungen > Elemente then raise Exception.Create('Man kann nicht mehr Kugeln ziehen als in der Urne sind'); SetLength(Sortiert, Ziehungen); SetLength(Gezogene, Ziehungen); for I := 0 to Ziehungen -1 do begin K := 0; N := Random(Elemente - I) + 1; for J := 0 to I -1 do if N >= Sortiert[J] then begin Inc(N); Inc(K); end else Break; for J := I downto K +1 do Sortiert[J] := Sortiert[J -1]; Sortiert[K] := N; Gezogene[I] := N; end; end; procedure Test; procedure Print(const Title: String; const Zahlen: TZahlen); var I: Integer; begin Write(Title); for I := 0 to High(Zahlen) do Write(Zahlen[I]:4); WriteLn; end; var Sortiert,Gezogene: TZahlen; begin Lotto(Sortiert, Gezogene, 10, 10); Print('gezogene : ', Gezogene); Print('sortiert : ', Sortiert); WriteLn; end; |
Re: Zufalsgenerator - Zahlen auslassen ?
Delphi-Quellcode:
Müsstest du so aufrufen: zielarray:= ZufallIA(1,10,10);
function ZufallIA(loinp,hiinp,laenge:integer):AoInt;
{type AoInt=array of integer;}//Wenn nötig deklarieren! var pos,laenge,i:integer; puffer:AoInt; procedure ZufalloD(var a:AoInt;lo,hi:integer); var z,b:integer; begin b := hi-lo; z:=Random(b)+lo; a[pos] :=z; inc(pos); if(lo<z)and(pos<=laenge) then ZufalloD(a,lo,z-1); if(hi>z)and(pos<=laenge) then ZufalloD(a,z+1,hi); end; begin randomize; setlength(puffer,laenge); pos:=low(puffer); ZufalloD(puffer,loinp,hiinp); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz