with A83_014_Vector; use A83_014_Vector; -- for Demo with ConsAKD ; use ConsAKD ; -- for Demo with InteAKD ; use InteAKD ; -- for Demo with FloaAKD ; use FloaAKD ; -- for Demo with MathAKD ; use MathAKD ; -- for Ln and SqRt with TextAKD ; use TextAKD ; -- for Demo package body DOS_017_Random is ---------------------------------------------------------------------- ---------------------------------------------------------------------- procedure Demo is ---------------------------------------------------------------------- Seed : Random_Seed_Type; Loops : constant positive := 1_000; Exps : Vector_Type ( 1..Loops ); Gaus : Vector_Type ( 1..Loops ); Vari : float := 1.0; St_Dev : float; begin Put_Line ( Copyright ); Put_Line ( Description ); New_Line; Put ( Loops ); Put_Line ( " random numbers will be generated for each distribution." ); New_Line; Vari := Ask ( "Desired Gaussian variance ", Vari ); St_Dev := SqRt ( Vari ); for Index in Exps'range loop Random_Exp ( Exps ( Index ), Seed ); Exps ( Index ) := Exps ( Index ); Random_Gaussian ( Gaus ( Index ), Seed, St_Dev ); Put ( Index ); Put ( " Random_Exp: " ); Put ( Exps ( Index ) ); Put ( " Random_Gaussian: " ); Put ( Gaus ( Index ) ); New_Line; end loop; Put ( "Random_Exp :: Mean: " ); Put ( Mean ( Exps ) ); Put ( " Variance: " ); Put ( Variance ( Exps ) ); New_Line; Put ( "Random_Gaussian :: Mean: " ); Put ( Mean ( Gaus ) ); Put ( " Variance: " ); Put ( Variance ( Gaus ) ); New_Line; New_Line; Pause; end Demo; procedure Random_Exp ( Random : out float; Seed : in out Random_Seed_Type ) is ---------------------------------------------------------------------- R : float; begin Random_1 ( R, Seed ); Random := -Ln ( R ); end Random_Exp; procedure Random_Gaussian ( Random : out float; Seed : in out Random_Seed_Type; Standard_Deviation : in float := 1.0 ) is ---------------------------------------------------------------------- Fac, R, V1, V2 : float; Ran3 : float; Temp : float; begin if Seed.GlISet = 0 then loop Random_1 ( Ran3, Seed ); V1 := 2.0 * Ran3 - 1.0; Random_1 ( Ran3, Seed ); V2 := 2.0 * Ran3 - 1.0; R := V1 ** 2 + V2 ** 2; exit when R < 1.0; end loop; Fac := SqRt ( -2.0 * Ln ( R ) / R ); Seed.GlGSet := V1 * Fac; Temp := V2 * Fac; Seed.GlISet := 1; else Temp := Seed.GlGSet; Seed.GlISet := 0; end if; Random := Standard_Deviation * Temp; end Random_Gaussian; ---------------------------------------------------------------------- ---------------------------------------------------------------------- end DOS_017_Random;