Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Random ohne doppelte Zahlen (https://www.delphipraxis.net/121705-random-ohne-doppelte-zahlen.html)

D0N 2. Okt 2008 21:22


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:
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;
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.

mfg

Z4ppy 2. Okt 2008 21:53

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

Dunkel 2. Okt 2008 22:05

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, ...)

hamburcher 3. Okt 2008 00:00

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

alzaimar 3. Okt 2008 07:56

Re: Random ohne doppelte Zahlen
 
Stichworte 'Permutation', 'Fisher-Yates' usw.

Valle 3. Okt 2008 10:22

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

KLS 3. Okt 2008 12:57

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;

alzaimar 3. Okt 2008 13:05

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?

SirTwist 3. Okt 2008 13:16

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

KLS 3. Okt 2008 13:17

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 10:39 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz