Talk:Samples and permutations
From Free Pascal wiki
Jump to navigationJump to searchThe printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
ANother example, not using 2 arrays, but only one, maybe:
type
TIntegerDynArray= array of Integer;
{
Returns an array of aSize random integers without duplicates ranging from
aFrom (inclusive) to aTo (exclusive).
- aFrom and aTo must be positive integers
- aTo must be > aFrom
- aSize must be <= aTo - aFrom
- if either of these conditions is not met, an empty array will be returned.
}
function RandomArray(aFrom, aTo, aSize: Integer): TIntegerDynArray; overload;
var
i, j, temp, Range: Integer;
begin
Range := (aTo - aFrom);
if (aFrom < 0) or (aFrom >= aTo) or (aSize > Range) then
Exit(nil);
SetLength(Result, Range);
for i := Low(Result) to High(Result) do Result[i] := aFrom + i;
// Use te Sattolo algorithm to shuffle the array
// https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Sattolo.27s_algorithm
i := Length(Result);
while i > 0 do
begin
Dec(i);--~~~~
j := Random(i);
temp := Result[i];
Result[i] := Result[j];
Result[j] := temp;
end;
if (aSize <> Range) then
SetLength(Result, aSize);
end;
function RandomArray(aFrom, aTo: Integer): TIntegerDynArray; inline; overload;
begin
Result := RandomArray(aFrom, aTo, (aTo - aFrom));
end;
function RandomArray(Range: Integer): TIntegerDynArray; inline; overload;
begin
Result := RandomArray(0, Range, Range);
end;
- Thanks for providing this alternative example. I expect it to be more memory-efficient than my code. This may be especially beneficial in low-memory situations and embedded systems. It doesn't allow, however, for replacement. So, it may depend on the intended use and platform which algorithm to prefer. --Jwdietrich (talk) 14:18, 21 November 2020 (CET)