Difference between revisions of "Talk:Samples and permutations"

From Free Pascal wiki
Jump to navigationJump to search
 
Line 26: Line 26:
 
   while i > 0 do
 
   while i > 0 do
 
   begin
 
   begin
     Dec(i);
+
     Dec(i);--~~~~
 
     j := Random(i);
 
     j := Random(i);
 
     temp := Result[i];
 
     temp := Result[i];
Line 49: Line 49:
 
----
 
----
 
: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. --[[User:Jwdietrich|Jwdietrich]] ([[User talk:Jwdietrich|talk]]) 14:18, 21 November 2020 (CET)
 
: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. --[[User:Jwdietrich|Jwdietrich]] ([[User talk:Jwdietrich|talk]]) 14:18, 21 November 2020 (CET)
 +
::Thanks for clarifying that (replacement).--[[User:Bart|Bart]] ([[User talk:Bart|talk]]) 17:00, 21 November 2020 (CET)

Latest revision as of 18:00, 21 November 2020

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)
Thanks for clarifying that (replacement).--Bart (talk) 17:00, 21 November 2020 (CET)