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