home *** CD-ROM | disk | FTP | other *** search
- { From : Dr John Stockton (JRS@merlyn.demon.co.uk)
-
- Function RandomGaussianSD1 returns a number drawn from
- a Gaussian distribution with mean of zero, unit standard
- deviation, cutoff at +/- 4 ; I have taken it from another,
- working, program.
-
- It may very easily be amended for any distribution
- whatsoever, provided that the probability density may
- be sufficiently well represented by a known expression
- within a finite rectangular box;
- see RandomDistrib, which is but slightly tested.
-
- In each case, the probable time taken varies inversely with
- the fraction of the box area which is under the PD line. }
-
-
- program Distribs ;
-
-
- function RandomGaussianSD1 : extended
- { Gaussian distribution, SD = 1, cutoff @ +/- 4.0 } ;
- var X : extended ;
- begin
- repeat X := (Random-0.5)*8.0 ;
- until Exp(-Sqr(X)*0.5)>Random ;
- RandomGaussianSD1 := X end {RandomGaussianSD1} ;
-
- procedure GaussTest ;
- var j : byte ; s, t : extended ; const k = 80 ;
- begin t := 0.0 ;
- for j := 1 to k do begin
- s := RandomGaussianSD1 ; t := t + Sqr(s) ;
- Write(s:9:3) ; if (j and 7)=0 then Writeln ;
- end ;
- Writeln('RMS: ', Sqrt(t/k):10:3, ' ~ 1 ? '^G) ;
- Write('That should look Gaussian, mean 0, RMS 1 !') ;
- end {GaussTest} ;
-
-
- { The following more general form is less tested but should be OK : }
-
- type func = function (X : extended) : extended
- { Normalised so that 0.0 <= func <= 1.0 } ;
-
- function RandomDistrib(Min, Max : extended ; Fn : func) : extended
- { Fn distribution from Min to Max } ;
- var X : extended ;
- begin repeat X := Random*(Max-Min) + Min until Fn(X)>Random ;
- RandomDistrib := X end {RandomDistrib} ;
-
- function Gauss(X : extended) : extended ; FAR ;
- begin Gauss := Exp(-Sqr(X)*2.0) end {Gauss} ;
-
- procedure GenTest ;
- var j : byte ; s, t : extended ; const k = 80 ;
- begin t := 0.0 ;
- for j := 1 to k do begin
- s := RandomDistrib(-6.0, +6.0, Gauss) ; t := t + Sqr(s) ;
- Write(s:9:3) ; if (j and 7)=0 then Writeln ;
- end ;
- Writeln('RMS: ', Sqrt(t/k):10:3, ' ~ 1 ? '^G) ;
- Write('That should look Gaussian, mean 0, RMS 0.5 !') ;
- end {GenTest} ;
-
-
- BEGIN ;
- Writeln('Distributions :') ;
- Randomize ;
- GaussTest ; Readln ;
- GenTest ; Readln ;
- END. E&OE.