![]() |
Random ohne doppelte Zahlen
Hallo
ich habe vor für meinen Clan n Programm zu schreiben welches durch das benutzen von random eine Zufällige map auswählt oder eine Zufällige aufstellung (TF2) nun habe ich Das problem das es ja sehr schlecht ist wenn in einer Aufstellung jemand doppelt vorkommt. Da dachte ich mir hmm keine zahl doppelt dürfte ja kein Problem sein. Mit Array kenne ich mich nicht aus. Ich wollte nach jedem durchlauf der Schleife das ergebnis in eine Listbox schreiben lassen um das nächste ergebnis damit abzugleichen. Nur weiß ich nicht wie und vorallem ob man überhaupt mit der Listbox abgleichen kann. Vielleicht habt ihr ja bessere Vorschläge dafür.
Delphi-Quellcode:
Weiß nicht ob ich irgendwas Falsch gemacht habe denn ich kenne mich noch nicht so gut mit Delphi aus hatte es erst 1/2 jahr in der Schule.
procedure TForm1.Button2Click(Sender: TObject);
var zufall, anzahl, ergebniss, i, zaehler, cnt:integer; found: boolean; a: string; begin button2.Visible:= False; panel1.Visible:= false; panel2.Visible:= True; a:= labelededit1.Text; zaehler:= 0; zufall:= 0; anzahl:= strtoint(labelededit13.Text); if radiobutton2.Checked = (true) then for i := 1 to anzahl do begin { repeat begin randomize;} zufall:= random(anzahl)+1; {end until zufall <> ergebniss; begin ergebniss:= zufall;} inc(zaehler); if zufall = listbox1.Items[listbox1.ItemIndex] then zufall:= random(anzahl)+1 else begin case zufall of 1: memo1.Lines.Add(inttostr(zaehler) + '. Slot: ' + labelededit1.Text); 2: memo1.Lines.Add(inttostr(zaehler) + '. Slot: ' + labelededit1.Text); 3: memo1.Lines.Add(inttostr(zaehler) + '. Slot: ' + labelededit1.Text); 4: memo1.Lines.Add(inttostr(zaehler) + '. Slot: ' + labelededit1.Text); 5: memo1.Lines.Add(inttostr(zaehler) + '. Slot: ' + labelededit1.Text); 6: memo1.Lines.Add(inttostr(zaehler) + '. Slot: ' + labelededit1.Text); 7: memo1.Lines.Add(inttostr(zaehler) + '. Slot: ' + labelededit1.Text); 8: memo1.Lines.Add(inttostr(zaehler) + '. Slot: ' + labelededit1.Text); 9: memo1.Lines.Add(inttostr(zaehler) + '. Slot: ' + labelededit1.Text); 10: memo1.Lines.Add(inttostr(zaehler) + '. Slot: ' + labelededit1.Text); 11: memo1.Lines.Add(inttostr(zaehler) + '. Slot: ' + labelededit1.Text); 12: memo1.Lines.Add(inttostr(zaehler) + '. Slot: ' + labelededit1.Text); end; end; listbox1.Items.Add(inttostr(zufall)); end; if radiobutton1.Checked = (true) then begin zufall:= random(anzahl) + 1; case zufall of 1 : memo1.lines.add('Slot: ' + labelededit1.Text); 2: memo1.lines.add('Slot: ' + labelededit2.Text); 3: memo1.lines.add('Slot: ' + labelededit3.Text); 4: memo1.lines.add('Slot: ' + labelededit4.Text); 5: memo1.lines.add('Slot: ' + labelededit5.Text); 6: memo1.lines.add('Slot: ' + labelededit6.Text); 7: memo1.lines.add('Slot: ' + labelededit7.Text); 8: memo1.lines.add('Slot: ' + labelededit8.Text); 9: memo1.lines.add('Slot: ' + labelededit9.Text); 10: memo1.lines.add('Slot: ' + labelededit10.Text); 11: memo1.lines.add('Slot: ' + labelededit11.Text); 12: memo1.lines.add('Slot: ' + labelededit12.Text); end; end; end; mfg |
Re: Random ohne doppelte Zahlen
Hmm, warum machst du das net einfach so, dass du alle Leute in eine Liste schreibst, dann aus dieser Liste einen auswählst und ihn aus der Liste streichst? Dann haste ihn sicher net doppelt...
MfG Z4ppy |
Re: Random ohne doppelte Zahlen
Oder, um Z4ppys Worte ins "Reallife" zu übertragen:
Wie stellst Du sicher, dass von einem Kartenspiel jede Karte nur einmal vergeben wird? Mische den Kartenstapel einmal ordentlich durch und verteile diese dann. Es existiert auch ein Algorithmus um doppelte Zahlen zu vermeiden; Suchfunktion des Forums benutzen! Und man nutzt keine VCL-Komponenten zur Datenspeicherung! Dafür gibt es ganz tolle Listenobjekte in Delphi (TStringList, TObjectList, ...) |
Re: Random ohne doppelte Zahlen
Lottozahlen könnten was mit Deinem Problem zu tun haben, zufällige 6 aus 49 ohne Duplikate.
Such doch mal in der DP nach Lottozahlen... HTH |
Re: Random ohne doppelte Zahlen
Stichworte 'Permutation', 'Fisher-Yates' usw.
|
Re: Random ohne doppelte Zahlen
Liste der Anhänge anzeigen (Anzahl: 1)
Oder wenn du es ganz selbst machen möchtest: Ich habe hier eine Möglichkeit als PDF in den Anhang getan. Habe ich aus reiner Langeweile mal schnell mit OpenOffice gemacht. ;-)
Mit freundlichen Grüßen, Valle |
Re: Random ohne doppelte Zahlen
Also ich hab hier nen code, bei dem man in ~17ms (meine alte 3GHz Monocoremöre ;)) ein Array mit 100.000 Zufallszahlen ohne Doppelte erstellen kann.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var variablen : array[1..100000] of integer; i,zufall : integer; start,ende,frequenz,counter : int64; begin randomize; QueryPerformanceFrequency(frequenz); counter := 0; QueryPerformanceCounter(start); for i := 1 to high(variablen) do variablen[i] := 0; for i := 1 to high(variablen) do begin repeat zufall := random(high(variablen)) + 1; inc(counter); //bei 100.000 ca. 1,1 Mio until variablen[zufall] = 0; variablen[zufall] := i; end; QueryPerformanceCounter(ende); { memo1.Lines.BeginUpdate; for i := 1 to high(variablen) do memo1.Lines.Add(inttostr(variablen[i])); memo1.Lines.EndUpdate; } memo1.Lines.Add(floattostr((ende-start)/frequenz)+'s'); memo1.Lines.Add(inttostr(counter)); end; |
Re: Random ohne doppelte Zahlen
Irgendwann wird deine Schleife nicht terminieren. Du kannst das nicht ausschließen, und Du kannst auch nicht vorhersagen, wann es passiert. Aber es *wird* passieren, und dann?
|
Re: Random ohne doppelte Zahlen
In der Informatiker-Bibel (die große Version: "The Art Of Computer Programming" von Donald E. Knuth) ist beschrieben, wie man eine Folge a(n) bildet, so dass es aussieht, als ob die Zahlen quasi zufällig ausgewählt werden, aber bei n Durchläufen auch wirklich alle n Zahlen erwischt werden.
Leider finde ich das Buch gerade nicht, müsste in Band 3 stehen. Gruß, SirTwist |
Re: Random ohne doppelte Zahlen
hast schon recht, ist aber bei etlichen versuchen nicht passiert.
Man könnte natürlich nen sicherheitszähler einbauen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 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