Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#10

Re: Datensätze zufällig anzeigen, aber alle nur einmal

  Alt 10. Apr 2005, 13:56
Delphi-Quellcode:
function RandomUnique(Index,Count: Integer; Order: Integer = $12345678): Integer;
var
  Seed,I,J: Integer;
begin
  Seed := RandSeed;
  try
    for I := 0 to Count -1 do
    begin
      RandSeed := Order;
      for J := 0 to Count -1 do
        if Random(Count) = I then
          if Index = 0 then
          begin
            Result := J;
            Exit;
          end else Dec(Index);
    end;
    Result := 0; // dieser Fall kann eigentlich nie eintreten
  finally
    RandSeed := Seed;
  end;
end;

Obige Funktion kannst du so einsetzen wie gewünscht:

Delphi-Quellcode:

ListOrder := Random(MaxInt);

// 1. Datensatz
DataSet.RecNo := RandomUnique(0, DataSet.RecordCount, ListOrder);
// 2. Datensatz
DataSet.RecNo := RandomUnique(1, DataSet.RecordCount, ListOrder);
// 3. Datensatz
DataSet.RecNo := RandomUnique(2, DataSet.RecordCount, ListOrder);
Der Parameter "Order" stellt dabei sowas wie eine eindeutige Nummer zur Reihenfolge der erzeugten Nummern dar. Er muss für jeden Aufruf der Funktion die zur gleichen Liste stammt auch immer gleich sein.

Das Verfahren ansich ist echt simpel. Durch die Manpulation von RandSeed == Startwert des Zufallsgenerators erzeugt man zu jedem Zeitpunkt ausgehend von Order immer wieder die gleiche Liste von Zufallszahlen (dafür ist ja auch ein Pseudozufallsgenerator und RandSeed gedacht ) Wir müssen also nun nur noch die "Filterung" für das auszuwählende Element der so produzierten Zufallszahlenliste vornehmen.
Man muß halt Count^2 mal durch diese Liste durchgehen um eine Eindeutigkeit zu produzieren, da unsere Random() Funktion eben nicht eindeutige Nummern erzeugt.

Nungut, obige Funktion sollte somit auch diese häufig gestellte Frage beantworten.

Gruß Hagen
  Mit Zitat antworten Zitat