Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi bei Random niemals diegleiche Zahl (https://www.delphipraxis.net/7782-bei-random-niemals-diegleiche-zahl.html)

Moyyer 21. Aug 2003 12:12


bei Random niemals diegleiche Zahl
 
Hallo alle Zusammen.

Wie könnte man einen Zufallsgenerator entwickeln, der zwar unterschiedliche Zahlen, aber niemlas eine doppelt ausgibt?
Gibt es da eine vordefinierte oder muss man sich da selbst was einfallen lassen?

Mfg Moyyer

Hansa 21. Aug 2003 12:14

Re: bei Random niemals diegleiche Zahl
 
selber machen. Am besten die vorhandenen in eine Datei schreiben und dann überprüfen, ob sie schon drin ist.

Stanlay Hanks 21. Aug 2003 12:16

Re: bei Random niemals diegleiche Zahl
 
Zitat:

Zitat von Hansa
selber machen. Am besten die vorhandenen in eine Datei schreiben und dann überprüfen, ob sie schon drin ist.

Vielleicht eher Array... :wink:

Man liest sich, Stanlay :hi:

Illuminator-23-5 21. Aug 2003 12:20

Re: bei Random niemals diegleiche Zahl
 
man könnte einen TStrings machen, den mit allen Zahlen von 1 bis n füllen, dann random(Zahlen.Count) machen und die Zahl mit dem Index im TString hernehmen!

Moyyer 21. Aug 2003 13:33

Re: bei Random niemals diegleiche Zahl
 
währe jemand so nett und schreibt mir eine procedure, die für mehr Verständlichkeit dient? Ich werde aus euren antworten irgendwie nicht schlau? :gruebel:

Stanlay Hanks 21. Aug 2003 13:50

Re: bei Random niemals diegleiche Zahl
 
Also, du machst zum Beispiel ein Integer Array. Jedes Mal, wenn du eine Zufallszahl erzeugst, überprüfst du, ob diese gerade erzeugte Zahl bereits in dem Array vorhanden ist. Wenn ja, machst du eine neue Zahl, wenn nicht, dann schreibst du diese Zahl zuerst in das Array (SetLength nicht vergessen) und übernimmst die Zahl dann für deine Zwecke.

Man liest sich, Stanlay :hi:

Tpercon 21. Aug 2003 13:58

Re: bei Random niemals diegleiche Zahl
 
Da ich so einen ähnlichen Code eben schon in einem anderen Beitrag gepostet habe, will ich mal nicht so sein:
Delphi-Quellcode:
private
    numbers: array of integer;
...
procedure getnumbers;
var i, j, x: integer;

  function inarray(number: integer): boolean;
  var i : integer;
  begin
    result := false;
    for i := 0 to High(numbers) do begin
      if numbers[i] = number then begin
        result := true;
        Break;
      end;
    end;
  end;

begin
  SetLength(numbers, 0);
  while High(numbers) < 10 do begin//Anzahl Zahlen
    x := random(100) + 1;//Wertebereich
    if inarray(x) = false then begin
       j := High(numbers) + 1;
       SetLength(numbers, j + 1);
       numbers[j] := x;
     end;
  end;
  Caption := InttoStr(High(numbers));
  ListBox1.Items.Clear;
  for i:= 0 to High(numbers) do
    ListBox1.Items.Add(InttoStr(numbers[i]));
end;
Das nächste mal kannst du auch die Suche benutzen, gibt's bestimmt schon!

Illuminator-23-5 21. Aug 2003 14:06

Re: bei Random niemals diegleiche Zahl
 
normale zufallsgeneratoren werden ja mit zufallszahlen-listen gemacht. in denen kommen alle Ziffern, Ziffernpaare, ZiffernTripel gleich oft vor (sollten sie zumindest). Je genauer das beachtet wird, desto genauer wird der generator.
Ich hab hier versucht, etwas zu schreiben, das hinkommen könnte:
Delphi-Quellcode:
TRandom = object
  Strings: TStrings;
  procedure Create;
  procedure Destroy;
  procedure Randomize;
  function Random: integer;
  procedure SetLength(l: integer);
end;

procedure TRandom.Create;
begin
  Strings := TStrings.Create;
end;

procedure TRandom.Destroy;
begin
  Strings.Destroy;
end;

procedure TRandom.SetLength(l: integer);
begin
  strings.Clear;
  for i := 1 to l do
    strings.Add(IntToStr(i);
end;

procedure Randomize;
begin
  Randomize;
end;

function Random;
begin
  result := StrToInt(strings[random(strings.count)]);
end;
Man könnte auch selbst eine solche liste schreiben schreiben und den zufallsgenerator total selbst programmieren!!
(für listen eignen sich auch die kommastellen von unendlichen, aber nicht periodischen Zahlen, wie Pi, Wurzel2 und Eulersche Zahl!)!!

Moyyer 21. Aug 2003 14:58

Re: bei Random niemals diegleiche Zahl
 
Danke, die Bsp sind super und jetzt kann ich mir dabei auch selbst was denken! Merci :love:

Mfg Moyyer

overmoon 21. Aug 2003 21:00

Re: bei Random niemals diegleiche Zahl
 
Auch, wenn das Thema ja schon fast erledigt ist, habe ich auch noch einen Vorschlag.

Die Prozedur "InitZufallsZahlen" füllt ein variables array mit den Zahlen eines bestimmten Bereichs. Über die Funktion "GetZufallsZahl" kann man sich dann Zufallszahlen nehmen bis das Array leer ist (Denn, wenn man sich eine holt, wird sie aus dem Array entfernt.). So ist sichergestellt, dass keine Zufallszahl doppelt vorkommt.

Delphi-Quellcode:
//==============================================================================

var ZufallsZahlen : array of Integer;

//==============================================================================

procedure InitZufallsZahlen(ErsteZahl, LetzteZahl: Integer);
var index : Integer;
begin
     if LetzteZahl < ErsteZahl then Exit;
     Randomize;
     SetLength(ZufallsZahlen,LetzteZahl-ErsteZahl+1);
     for index := 0 to Length(ZufallsZahlen)-1 do
     ZufallsZahlen[index] := ErsteZahl + index;
end;

//==============================================================================

function GetZufallsZahl(var ZufallsZahl: Integer):Boolean;
var position : Integer;
    index   : Integer;
begin
     if Length(ZufallsZahlen) > 0 then
     begin
          position   := random(Length(ZufallsZahlen));
          ZufallsZahl := ZufallsZahlen[position];
          for index := position to Length(ZufallsZahlen)-2 do
          ZufallsZahlen[index] := ZufallsZahlen[index+1];
          SetLength(ZufallsZahlen,Length(ZufallsZahlen)-1);
          result     := True;
     end
     else
     begin
          ZufallsZahl := 0;
          result     := False;
     end;
end;

//==============================================================================
Natürlich kann man auch meinen Vorschlag auf beliebige Typen ausweiten. man müsste nur folgendes ändern:
1.) Statt "array of integer" "Array of MEIN_TYP" schreiben
2.) Eine eigene InitZufallszahlen schreiben
3.) Bei der Funktion GetZufallsZahl den var-Paramter ändern.

overmoon


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