Difference between revisions of "Delphi compatible LCG Random"

From Lazarus wiki
Jump to navigationJump to search
Line 14: Line 14:
 
interface
 
interface
  
function DelphiRandom: extended; overload;inline;
+
function LCGRandom: extended; overload;inline;
function DelphiRandom(const range:longint):longint;overload;inline;
+
function LCGRandom(const range:longint):longint;overload;inline;
  
 
implementation
 
implementation
Line 25: Line 25:
 
end;
 
end;
  
function DelphiRandom: extended; overload;inline;
+
function LCGRandom: extended; overload;inline;
 
begin
 
begin
 
   Result := IM * 2.32830643653870e-10;
 
   Result := IM * 2.32830643653870e-10;
 
end;
 
end;
  
function DelphiRandom(const range:longint):longint;overload;inline;
+
function LCGRandom(const range:longint):longint;overload;inline;
 
begin
 
begin
 
   Result := IM * range shr 32;
 
   Result := IM * range shr 32;

Revision as of 17:37, 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 LCGRandom: extended; overload;inline;
function LCGRandom(const range:longint):longint;overload;inline;

implementation

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

function LCGRandom: extended; overload;inline;
begin
  Result := IM * 2.32830643653870e-10;
end;

function LCGRandom(const range:longint):longint;overload;inline;
begin
  Result := IM * range shr 32;
end;

end.