AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi bei Random niemals diegleiche Zahl
Thema durchsuchen
Ansicht
Themen-Optionen

bei Random niemals diegleiche Zahl

Ein Thema von Moyyer · begonnen am 21. Aug 2003 · letzter Beitrag vom 21. Aug 2003
Antwort Antwort
Seite 1 von 2  1 2      
Moyyer

Registriert seit: 31. Mai 2003
155 Beiträge
 
Delphi 7 Enterprise
 
#1

bei Random niemals diegleiche Zahl

  Alt 21. Aug 2003, 13:12
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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: bei Random niemals diegleiche Zahl

  Alt 21. Aug 2003, 13:14
selber machen. Am besten die vorhandenen in eine Datei schreiben und dann überprüfen, ob sie schon drin ist.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#3

Re: bei Random niemals diegleiche Zahl

  Alt 21. Aug 2003, 13:16
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...

Man liest sich, Stanlay
  Mit Zitat antworten Zitat
Illuminator-23-5
(Gast)

n/a Beiträge
 
#4

Re: bei Random niemals diegleiche Zahl

  Alt 21. Aug 2003, 13:20
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!
  Mit Zitat antworten Zitat
Moyyer

Registriert seit: 31. Mai 2003
155 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: bei Random niemals diegleiche Zahl

  Alt 21. Aug 2003, 14:33
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?
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#6

Re: bei Random niemals diegleiche Zahl

  Alt 21. Aug 2003, 14:50
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
  Mit Zitat antworten Zitat
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#7

Re: bei Random niemals diegleiche Zahl

  Alt 21. Aug 2003, 14:58
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!
  Mit Zitat antworten Zitat
Illuminator-23-5
(Gast)

n/a Beiträge
 
#8

Re: bei Random niemals diegleiche Zahl

  Alt 21. Aug 2003, 15:06
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!)!!
  Mit Zitat antworten Zitat
Moyyer

Registriert seit: 31. Mai 2003
155 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: bei Random niemals diegleiche Zahl

  Alt 21. Aug 2003, 15:58
Danke, die Bsp sind super und jetzt kann ich mir dabei auch selbst was denken! Merci

Mfg Moyyer
  Mit Zitat antworten Zitat
Benutzerbild von overmoon
overmoon

Registriert seit: 8. Aug 2003
Ort: Passau
51 Beiträge
 
Delphi 6 Personal
 
#10

Re: bei Random niemals diegleiche Zahl

  Alt 21. Aug 2003, 22:00
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
"Habe Mut, dich deines eigenen Verstandes zu bedienen." (Immanuel Kant)
  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 23:28 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