{ >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.