Delphi-PRAXiS
Seite 1 von 2  1 2      

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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:32 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