Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

Generating Repeatable Random Data for Testing/Debugging

See more PRNG Examples

Demonstrates how to use the Fortuna PRNG to generate random-looking but repeatable non-random data for the purpose of testing and debugging.

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Prng;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  fortuna: TPrng;
  strRandHex: string;
  strRandBase64: string;
  strRandBase58: string;
  fortuna2: TPrng;

begin
  success := False;

  //  This example assumes the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  success := False;

  fortuna := TPrng.Create;

  //  Normally an application would seed the PRNG with entropy from
  //  some real random source.  However, sometimes we want the same
  //  random sequence of bytes for testing and debugging purposes.
  //  This a reason why GetEntropy and AddEntropy are two different methods.
  //  An application could omit the call to GetEntropy, and instead pass
  //  non-random data to AddEntropy. For example:

  //  Seed the PRNG with non-entropy, so we get a repeatable sequence.
  //  Note: AddEntropy can be called any number of times.
  success := fortuna.AddEntropy('01020304','hex');
  success := fortuna.AddEntropy('hello world','ascii');

  //  Generate some random data:
  strRandHex := fortuna.GenRandom(16,'hex');
  strRandBase64 := fortuna.GenRandom(22,'base64');
  strRandBase58 := fortuna.GenRandom(32,'base58');

  WriteLn('hex random bytes: ' + strRandHex);
  WriteLn('base64 random bytes: ' + strRandBase64);
  WriteLn('base58 random bytes: ' + strRandBase58);

  //  Try it again with a different object to verify that the same results are obtained:
  fortuna2 := TPrng.Create;

  success := fortuna2.AddEntropy('01020304','hex');
  success := fortuna2.AddEntropy('hello world','ascii');

  strRandHex := fortuna2.GenRandom(16,'hex');
  strRandBase64 := fortuna2.GenRandom(22,'base64');
  strRandBase58 := fortuna2.GenRandom(32,'base58');

  WriteLn('hex random bytes: ' + strRandHex);
  WriteLn('base64 random bytes: ' + strRandBase64);
  WriteLn('base58 random bytes: ' + strRandBase58);


  fortuna.Free;
  fortuna2.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.