![]() |
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 |
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.
|
Re: bei Random niemals diegleiche Zahl
Zitat:
Man liest sich, Stanlay :hi: |
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!
|
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:
|
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: |
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:
Das nächste mal kannst du auch die Suche benutzen, gibt's bestimmt schon!
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; |
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:
Man könnte auch selbst eine solche liste schreiben schreiben und den zufallsgenerator total selbst programmieren!!
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; (für listen eignen sich auch die kommastellen von unendlichen, aber nicht periodischen Zahlen, wie Pi, Wurzel2 und Eulersche Zahl!)!! |
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 |
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:
Natürlich kann man auch meinen Vorschlag auf beliebige Typen ausweiten. man müsste nur folgendes ändern:
//==============================================================================
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; //============================================================================== 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:35 Uhr. |
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