[Back to MATH SWAG index]  [Back to Main SWAG index]  [Original]

{
>Now I need a fast way of generating random numbers in Gaussian Distribution

This is my code for gaussian and uniform distribution.
After the unit there is a graphic test program.

From: randyd@alpha2.csd.uwm.edu (Randall Elton Ding)
}

unit rndgauss;


interface


function rnd: double;                  { returns uniform [0..1] }

function gauss(a,d: double): double;   { a is mean, d is std deviation }


implementation


function rnd: double;
  const
    bias = 1023;

  var
    data: record
            b: byte;
            d: double;
          end;
    x: array[0..8] of byte absolute data;
    e,i,j: word;

  begin
    for i:= 0 to 7 do x[i]:= lo(random(256));
    e:= bias;
    repeat
      j:= 0;
      for i:= 0 to 7 do begin
        j:= (x[i] shl 1) + hi(j);
        x[i]:= lo(j);
      end;
      e:= e-1;
      if (bias-e) mod 8 = 0 then x[0]:= lo(random(256));
    until (x[7] and $10) = $10;
    x[7]:= (x[7] and $0F) or lo(e shl 4);
    x[8]:= lo(e shr 4);
    rnd:= data.d;
  end;



function gauss(a,d: double): double;
  const
    t: double = 0;

  var
    v1,v2,r: double;

  begin
    if t=0 then begin
      repeat
        v1:= 2*rnd-1;
        v2:= 2*rnd-1;
        r:= v1*v1+v2*v2
      until r<1;
      r:= sqrt((-2*ln(r))/r);
      t:= v2*r;
      gauss:= a+v1*r*d;
    end
    else begin
      gauss:= a+t*d;
      t:= 0;
    end;
  end;



begin
end.


{---------------------- cut ---------------------------------}


program gaussiantest;

uses crt,graph,rndgauss;

const
  bgipath = 'c:\bp\bgi';
  largestx = 999;


procedure testplot;
  var
    htarry: array[0..largestx] of integer;
    x,y,w,h,m,v: word;

  begin
    fillchar(htarry,sizeof(htarry),#0);
    w:= getmaxx+1;
    h:= getmaxy;
    m:= getmaxx div 2;
    v:= getmaxx div 8;
    while not keypressed do begin
      x:= trunc(gauss(m,v));
      if x<=largestx then begin
        y:= htarry[x];
        if y<=h then begin
          putpixel(x,h-y,white);
          htarry[x]:= y+1;
        end;
      end;
    end;
  end;



procedure initbgi;
  var errcode,grmode,grdriver: integer;
  begin
    grdriver:= detect;
    initgraph (grdriver,grmode,bgipath);
    errcode:= graphresult;
    if errcode <> grok then begin
      writeln ('Graphics error: ',grapherrormsg (errcode));
      halt (1);
    end;
  end;



begin
  initbgi;
  testplot;
  closegraph;
end.


[Back to MATH SWAG index]  [Back to Main SWAG index]  [Original]