64 lines
2.1 KiB
Ada
64 lines
2.1 KiB
Ada
with Ada.Text_IO, Ada.Command_Line, Ada.Numerics.Float_Random,
|
|
Ada.Numerics.Generic_Elementary_Functions;
|
|
|
|
procedure Basic_Stat is
|
|
|
|
package FRG renames Ada.Numerics.Float_Random;
|
|
package TIO renames Ada.Text_IO;
|
|
|
|
type Counter is range 0 .. 2**31-1;
|
|
type Result_Array is array(Natural range <>) of Counter;
|
|
|
|
package FIO is new TIO.Float_IO(Float);
|
|
|
|
procedure Put_Histogram(R: Result_Array; Scale, Full: Counter) is
|
|
begin
|
|
for I in R'Range loop
|
|
FIO.Put(Float'Max(0.0, Float(I)/10.0 - 0.05),
|
|
Fore => 1, Aft => 2, Exp => 0); TIO.Put("..");
|
|
FIO.Put(Float'Min(1.0, Float(I)/10.0 + 0.05),
|
|
Fore => 1, Aft => 2, Exp => 0); TIO.Put(": ");
|
|
for J in 1 .. (R(I)* Scale)/Full loop
|
|
Ada.Text_IO.Put("X");
|
|
end loop;
|
|
Ada.Text_IO.New_Line;
|
|
end loop;
|
|
end Put_Histogram;
|
|
|
|
procedure Put_Mean_Et_Al(Sample_Size: Counter;
|
|
Val_Sum, Square_Sum: Float) is
|
|
Mean: constant Float := Val_Sum / Float(Sample_Size);
|
|
package Math is new Ada.Numerics.Generic_Elementary_Functions(Float);
|
|
begin
|
|
TIO.Put("Mean: ");
|
|
FIO.Put(Mean, Fore => 1, Aft => 5, Exp => 0);
|
|
TIO.Put(", Standard Deviation: ");
|
|
FIO.Put(Math.Sqrt(abs(Square_Sum / Float(Sample_Size)
|
|
- (Mean * Mean))), Fore => 1, Aft => 5, Exp => 0);
|
|
TIO.New_Line;
|
|
end Put_Mean_Et_Al;
|
|
|
|
N: Counter := Counter'Value(Ada.Command_Line.Argument(1));
|
|
Gen: FRG.Generator;
|
|
Results: Result_Array(0 .. 10) := (others => 0);
|
|
X: Float;
|
|
Val_Sum, Squ_Sum: Float := 0.0;
|
|
|
|
begin
|
|
FRG.Reset(Gen);
|
|
for I in 1 .. N loop
|
|
X := FRG.Random(Gen);
|
|
Val_Sum := Val_Sum + X;
|
|
Squ_Sum := Squ_Sum + X*X;
|
|
declare
|
|
Index: Integer := Integer(X*10.0);
|
|
begin
|
|
Results(Index) := Results(Index) + 1;
|
|
end;
|
|
end loop;
|
|
TIO.Put_Line("After sampling" & Counter'Image(N) & " random numnbers: ");
|
|
Put_Histogram(Results, Scale => 600, Full => N);
|
|
TIO.New_Line;
|
|
Put_Mean_Et_Al(Sample_Size => N, Val_Sum => Val_Sum, Square_Sum => Squ_Sum);
|
|
end Basic_Stat;
|