Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zufallszahlen von 1-26 generieren (https://www.delphipraxis.net/137855-zufallszahlen-von-1-26-generieren.html)

Delphi_gn7 29. Jul 2009 19:40


Zufallszahlen von 1-26 generieren
 
Hi,
ich möchte die Zahlen von 1-26 (jede einmal) in zufälliger reihenfolge in ein array speichern und habe dafür eine repeat until schleife geschrieben:

Delphi-Quellcode:
repeat
rnd:=random(25)+1;//zufallszahlerzeugen
if (pos(IntToStr(rnd),s)=0) // fügt zufallszahl dem array hinzu, falls diese zufallszahl bis jetzt noch nicht verwendet wurde
then begin
      a[counter]:=rnd;
      writeln(counter,': ',rnd);
      s:=s+IntToStr(rnd)+' '; // zufallszahl in einem string abspeichern, damit sie nicht nochmal ins array geschrieben wird
      counter:=counter+1; // wenn neue zufallszahl dem array hinzugefügt wurde, wird der zähler erhöht
      end;
until (counter=26);
allerdings schafft es die schleife nicht bis über 17-21 zufallszahlen. woran kann das liegen? oder dauert es nur unheimlich lange, bis die restlichen, noch nicht eingefügten zufallszahlen berechnet wurden?

toms 29. Jul 2009 19:46

Re: Zufallszahlen von 1-26 generieren
 
Hallo

Schreibe die Zahlen 1-26 in ein Array und "mische" es.

Delphi_gn7 29. Jul 2009 19:49

Re: Zufallszahlen von 1-26 generieren
 
Danke für die Antwort, aber wie geht das? da muss ich doch auch sicher mit zufall arbeiten

zeras 29. Jul 2009 19:49

Re: Zufallszahlen von 1-26 generieren
 
Ich würde eine Stringlist nehmen und die Zahlen dort reinschreiben.
Wenn du mit (pos(IntToStr(rnd),s)=0) eine 1 suchst, wirst du die in "1", aber auch in "11" finden.
Wenn du das mit einer Stringlist machst, dann sollte das eindeutiger sein
if sl.indexof(rnd)=-1 dann einfügen ansonsten weitersuchen

Delphi_gn7 29. Jul 2009 19:50

Re: Zufallszahlen von 1-26 generieren
 
ich hab noch nie mit stringlists gearbeitet... wie wärs denn, wenn ich nach rnd+' ' suche?

toms 29. Jul 2009 19:52

Re: Zufallszahlen von 1-26 generieren
 
Zitat:

Zitat von Delphi_gn7
Danke für die Antwort, aber wie geht das?

Ein Beispiel findest du hier (delphi.about.com)

hadschi92 29. Jul 2009 19:55

Re: Zufallszahlen von 1-26 generieren
 
Oder du mischt es so: http://www.delphipraxis.net/internal...=998529#998529

Aber das sollte eigentlich nicht so schwer sein, könnte man sich auch fast selbst überlegen ;)

Klaus01 29. Jul 2009 20:01

Re: Zufallszahlen von 1-26 generieren
 
Delphi-Quellcode:
var
  a : array[1..26] of char;
....
// initialisieren
for i:=1 to 26 do
  a[i]:= ' ';

counter :=0;

repeat
  // rnd := random(25)+1;
  // Aus der Hilfe: Random returns a random number within the range 0 <= X < Range.
  // bei Dir wird 26 nie erreicht.
  rnd:=random(26)+1;

  if a[rnd] <> 'x' then
    begin
      a[rnd]:='x';
      inc(counter,1);
    end;
until (counter=26);
// Ausgabe
for i:=1 to 26 do
  write(format('%3d %s',[i,a[i]]));
writeLn;
..funktioniert recht fix

Grüße
Klaus

BAMatze 29. Jul 2009 20:05

Re: Zufallszahlen von 1-26 generieren
 
[OT]
Hallo auch wenn das nicht gerade zu deinem Lösungsansatz gehört, ist noch ein kleiner Fehler drin (Habs ebend nur schnell überflogen, hoffe kein anderer hat dazu schon was gepostet).

Zitat:

Zitat von Delphi_gn7
Hi,ich möchte die Zahlen von 1-26 (jede einmal)

Delphi-Quellcode:
repeat
rnd:=random(25)+1; <-- hiermit erzeugst du aber nur Zahlen von 1 bis 25 erzeugen, da random(25) 0..24 abdeckt plus 1
...
until (counter=26);

einfach die 25 in eine 26 ändern.

MfG
BAMatze
[/OT]

Edit: Mist Klaus war ebend schneller und hat den Fehler im Quellcode schon verbessert

Satty67 29. Jul 2009 20:07

Re: Zufallszahlen von 1-26 generieren
 
Eine StringList ist zwar als Container nicht optimal... etwas oversized, aber wenn man schon munter am Code posten ist
Delphi-Quellcode:
procedure ShakeStringList(aStringList : TStringList);
var
  i, Count : Integer;
begin
  Count := aStringList.Count;
  for i := 0 to Count -1 do
    aStringList.Move(Random(Count), Random(Count));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  StringList : TStringList;
  i : Integer;
begin
  Randomize;
  StringList := TStringList.Create;
  try
    for i := 1 to 26 do
      StringList.Add(IntToStr(i));
    ShakeStringList(StringList);

    // Hier wird das Ergebnis in einer ListBox angezeigt
    ListBox1.Items.Assign(StringList);
  finally
    StringList.Free;
  end;
end;

Blup 30. Jul 2009 08:16

Re: Zufallszahlen von 1-26 generieren
 
Zu Lottozahlen und Zufallsfolgen gibt es ja bereits reichlich Beiträge hier.
Auch einen relativ universelle Funktion von mir:
http://www.delphipraxis.net/internal...t.php?t=151677 :wink:
Lottozahlen(1, 26, 26)

cruiser 30. Jul 2009 15:38

Re: Zufallszahlen von 1-26 generieren
 
Ich hab auch noch einen:

Delphi-Quellcode:
function MakeRandomIntArray(start, count: Integer): TIntegerDynArray;
var
   i, rnd, pnt: Integer;
begin
   SetLength(Result, count);
   
   for i = Low(Result) to High(Result) do
      Result[i] = start - 1;
   
   repeat
      rnd = Random(count);
      pnt = -1;
      i = -1;
      while pnt < rnd do
      begin
         Inc(i);
         if Result[i] < start then
            Inc(pnt);
      end;
      Dec(count);
      Result[i] = count + start;
   until count = 1;
   
   for i = Low(Result) to High(Result) do
      if Result[i] < start then
         Result[i] = start;
end;
ist aus nem c# projekt übersetzt und ungetestet, müsste aber seinen zweck tun

MakeRandomIntArray(1,26) sollte deinen Fall abdecken

Draos 30. Jul 2009 16:53

Re: Zufallszahlen von 1-26 generieren
 
Hab eine von Karten Mischen gemacht. Recht lustig sowas.
Delphi-Quellcode:
var I1,I2           :Byte;
    Merge          :Cardinal;
    iWerte         :Array of Integer;
begin
 Randomize;
 SetLength(iWerte,26);
 for I1:=0 to High(iWerte) do
  iWerte[I1]:=I1+1;

 while Merge>0 do begin
  I1:=Random(Length(iWerte));
  repeat
   I2:=Random(Length(iWerte));
  until I2<>I1;
  Tmp:=iWerte[I1];
  iWerte[I1]:=iWerte[I2];
  iWerte[I2]:=Tmp;
  Dec(Merge);
 end;
end;

Uwe Raabe 30. Jul 2009 19:41

Re: Zufallszahlen von 1-26 generieren
 
Zitat:

Zitat von Draos
Hab eine von Karten Mischen gemacht. Recht lustig sowas.

In der Tat recht lustig, wenn das nicht initialisierte Merge zufällig einen recht großen Wert hat...


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 Uhr.

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