AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Keine doppelten Zufallszahlen mehr

Ein Thema von kurtm1 · begonnen am 20. Jun 2005 · letzter Beitrag vom 20. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
kurtm1

Registriert seit: 12. Dez 2003
348 Beiträge
 
#1

Keine doppelten Zufallszahlen mehr

  Alt 20. Jun 2005, 18:46
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
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Keine doppelten Zufallszahlen mehr

  Alt 20. Jun 2005, 18:51
for x:=1 to b do IMO sollte das so aussehen:
for x := 1 to b - 1 do PS: Wenn du schon so überdimensionale Einrückung verwendest, dann benutze sie bitte auch richtig .

[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 .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
WoGe

Registriert seit: 16. Jun 2005
Ort: Kelkheim
178 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Keine doppelten Zufallszahlen mehr

  Alt 20. Jun 2005, 19:20
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
  Mit Zitat antworten Zitat
kurtm1

Registriert seit: 12. Dez 2003
348 Beiträge
 
#4

Re: Keine doppelten Zufallszahlen mehr

  Alt 20. Jun 2005, 19:27
@ 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.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: Keine doppelten Zufallszahlen mehr

  Alt 20. Jun 2005, 19:31
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 ! [/edit]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Keine doppelten Zufallszahlen mehr

  Alt 20. Jun 2005, 19:44
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=
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
kurtm1

Registriert seit: 12. Dez 2003
348 Beiträge
 
#7

Re: Keine doppelten Zufallszahlen mehr

  Alt 20. Jun 2005, 19:51
@ 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.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Keine doppelten Zufallszahlen mehr

  Alt 20. Jun 2005, 20:13
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;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
kurtm1

Registriert seit: 12. Dez 2003
348 Beiträge
 
#9

Re: Keine doppelten Zufallszahlen mehr

  Alt 20. Jun 2005, 20:20
die 2. variante liefert wieder doppelte Elemente
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Keine doppelten Zufallszahlen mehr

  Alt 20. Jun 2005, 20:28
Peinich, ja, vergiss es...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:15 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