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 Keine doppelten Zufallszahlen mehr (https://www.delphipraxis.net/48099-keine-doppelten-zufallszahlen-mehr.html)

kurtm1 20. Jun 2005 18:46


Keine doppelten Zufallszahlen mehr
 
Ich möchte ein Array mit Zufallszahlen füllen, wobei keine doppelt auftreten darf. Bis jetzt habe ich folgenden Code, es befindet sich aber irgendein Fehler drinnen, da ich noch doppelte Elemente bekomme.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var a:Array [1..10] of Byte;
var b, x, Hilf:byte;
begin
        ListBox1.Clear;

        a[1]:=random(10)+1;

        for b:=2 to 10 do
        begin
        hilf:=random(10)+1;
                for x:=1 to b do
                begin
                if hilf=a[x] then
                repeat
                hilf:=random(10)+1
                until hilf<>a[x];
                end;
                a[b]:=Hilf;
        end;

        for b:=1 to 10 do
        ListBox1.Items.Add(inttostr(a[b]));
end;
thx im voraus

Khabarakh 20. Jun 2005 18:51

Re: Keine doppelten Zufallszahlen mehr
 
Delphi-Quellcode:
for x:=1 to b do
IMO sollte das so aussehen:
Delphi-Quellcode:
for x := 1 to b - 1 do
PS: Wenn du schon so überdimensionale Einrückung verwendest, dann benutze sie bitte auch richtig :wink: .

[edit]Der eigentliche Fehler:
Wenn eine Zahl schon enthalten ist, generierst du eine neue. Du prüfst aber nur, ob sie mit a[i] übereinstimmt, nicht aber mit den Elementen 0..i-1.
Optimiert:
Du generierst eine Zufallszahl und prüfst, ob sie in den bisherigen Elementen vorhanden ist. Sobald das zutrifft, brichst du die Schleife ab und generierst eine neue, usw.
Die Implementierung überlasse ich dir :zwinker: .

WoGe 20. Jun 2005 19:20

Re: Keine doppelten Zufallszahlen mehr
 
Wenn ichs richtig sehe sollen 10 Zufallszahlen im Bereich 1..10 ohne doppelte erzeugt werden.
Dann kannst du auch ein Liste mit 10 Elementen anlegen und immer ein zufällig ausgewähltes in dein Array übertragen. Dieses dann löschen und aus der verbleibenden Liste wieder eins auswählen.

Die Zahl zum Auswählen muss auch entsprechend verkleinert werden.

Vorteil: gar keine Vergleiche notwendig

mfg
wo

kurtm1 20. Jun 2005 19:27

Re: Keine doppelten Zufallszahlen mehr
 
@ Khabarakh
Deine Lösung mit dem "-1" ändert nichts, doppelte sind noch immer enthalten

//EDIT: @WoGe:
Ich hab hier nur Zufallszahlen von 1..10 genommen, damit man schneller sieht ob es doppelte gibt.

Khabarakh 20. Jun 2005 19:31

Re: Keine doppelten Zufallszahlen mehr
 
Ich bin mal einer spontanen Idee gefolgt:
http://www.delphipraxis.net/internal...ct.php?t=56988

[edit]@WoGe: Genau, so habe ich es auch gemacht :thumb: ! [/edit]

alzaimar 20. Jun 2005 19:44

Re: Keine doppelten Zufallszahlen mehr
 
Was Du brauchst, ist eine zufällige Permutation der Folge 0 1 2 3 4 5 6 7 8 9.
Die Idee von WoGe ist also die Richtige.

Eine zufällige Permutation erzeugt man normalerweise so, in linearer Zeit (nach Fisher-Yates):
Delphi-Quellcode:
Const
 Count = 10;
Var
 A : Array[0..Count-1] of Integer;
 I, J, T : Integer;
begin
 For I := 0 to Count-1 do
  A[I] := I;
 For I := 0 to Count-1 do
 begin
  J := I+random(Count-I);
  T := A[J];
  A[J] := A[I];
  A[I] := T;
 end;
end
Der Code wurde von 'delfiPhan' in diesem Thread im delphi-forum gepostet.
http://www.delphi-forum.de/viewtopic...112&highlight=

kurtm1 20. Jun 2005 19:51

Re: Keine doppelten Zufallszahlen mehr
 
@ Topic: Anscheinend ist noch nicht zu 100% klar geworden was ich brauche:
Es sollen in einem Array 10 Zufallszahlen, die im Bereich 1..100 liegen, stehen, und zwar ohne doppelte Zahlen.

alzaimar 20. Jun 2005 20:13

Re: Keine doppelten Zufallszahlen mehr
 
aha
Delphi-Quellcode:
Var
  l : Array [0..9] Of Integer;
  r,i : Integer;

Begin
  For i := 0 to 9 do
    Repeat
      a[i] := Random (100);                       // Randomzahl einfügen
      j := 0;
      while a[j]<>a[i] do inc (j);            // Die gleiche Zahl suchen
    Until i=j; // Wenn die gleiche Zahl an Pos i steht, ist sie eindeutig
// Hier sind in a[0..9] eindeutige Zufallszahlen.
End;
Oder auch einfach mal den Code von delphifan modifizieren ....
Delphi-Quellcode:
const
  Count = 10;
Var
  A : Array[0..Count-1] of Integer;
  I, J, T : Integer;
begin
  For I := 0 to Count-1 do
    A[I] := Random (100); // <--- Das wars, Faulpelz ;-)
  For I := 0 to Count-1 do begin
    J := I+random(Count-I);
    T := A[J];
    A[J] := A[I];
    A[I] := T;
    end;
end;

kurtm1 20. Jun 2005 20:20

Re: Keine doppelten Zufallszahlen mehr
 
die 2. variante liefert wieder doppelte Elemente

alzaimar 20. Jun 2005 20:28

Re: Keine doppelten Zufallszahlen mehr
 
Peinich, ja, vergiss es...


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 Uhr.
Seite 1 von 2  1 2      

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