Difference between revisions of "Delphi compatible LCG Random"

From Free Pascal wiki
Jump to navigationJump to search
Line 2: Line 2:
 
Many Freepascal programmers also maintain sourcecode in Delphi.<br>
 
Many Freepascal programmers also maintain sourcecode in Delphi.<br>
 
Even if you have moved to Freepascal from Delphi you may have data that relies on Delphi's Random.<br>
 
Even if you have moved to Freepascal from Delphi you may have data that relies on Delphi's Random.<br>
Here are compatible routines that generate Delphi-identical pseudo-random numbers:
+
Here are cross-platform functions that generate Delphi-identical pseudo-random numbers:
 
<syntaxhighlight>
 
<syntaxhighlight>
 
unit drandom;
 
unit drandom;

Revision as of 15:30, 26 March 2017

Delphi compatible random numbers

Many Freepascal programmers also maintain sourcecode in Delphi.
Even if you have moved to Freepascal from Delphi you may have data that relies on Delphi's Random.
Here are cross-platform functions that generate Delphi-identical pseudo-random numbers:

unit drandom;
// Delphi compatible LCG random number generator routines for Freepascal.
// (c)2017, Thaddy de Koning. Use as you like
// Algorithm, Delphi multiplier and increment taken from:
// https://en.wikipedia.org/wiki/Linear_congruential_generator
// The default Delphi RandomSeed is determined as zero.
{$mode objfpc}

interface

function DelphiRandom: Double; overload;inline;
function DelphiRandom(range:integer):integer;overload;inline;

implementation

function IM:dword;inline;
begin
  RandSeed := RandSeed * 134775813  + 1;
  Result := RandSeed;
end;

function DelphiRandom: Double; overload;inline;
begin
  Result := IM * 2.32830643653870e-10;
end;

function DelphiRandom(range:integer):integer;overload;inline;
begin
  Result := IM * range shr 32;
end;

end.