with Ada.Text_IO, Calendar;
use Ada.Text_IO, Calendar;
package body Random is
X_initial : FLOAT_ITEM := 0.0;
M : FLOAT_ITEM := 1.0;
A : FLOAT_ITEM := 7.0;
C : FLOAT_ITEM := 13.0 / 31.0;
procedure Set_Seed is
Time_And_Date : TIME;
All_Day : DAY_DURATION;
Minutes : FLOAT_ITEM;
Int_Minutes : INTEGER;
Part_Of_A_Minute : FLOAT_ITEM;
begin
Time_And_Date := Clock; -- Get the time and date
All_Day := Seconds(Time_And_Date); -- Seconds since midnight
Minutes := FLOAT_ITEM(All_Day) / 60.0; -- Floating type Minutes
Int_Minutes := INTEGER(Minutes - 0.5); -- Integer type minutes
Part_Of_A_Minute := FLOAT_ITEM(All_Day)
- 60.0 * FLOAT_ITEM(Int_Minutes);
X_Initial := 0.1;
end Set_Seed;
procedure Force_Seed(Start_Seed : FLOAT_ITEM) is
Temp : FLOAT_ITEM;
Natural_Temp : NATURAL;
begin
Natural_Temp := NATURAL(Start_Seed - 0.5);
Temp := Start_Seed - FLOAT_ITEM(Natural_Temp);
X_Initial := Start_Seed;
exception
when Constraint_Error =>
Put_Line("Seed out of range, ignored");
end Force_Seed;
function Get_Seed return FLOAT_ITEM is
begin
return X_Initial;
end Get_Seed;
function Random_Number return FLOAT_ITEM is
Temp : FLOAT_ITEM;
Natural_Temp : NATURAL;
begin
Temp := A * X_Initial + C;
Natural_Temp := NATURAL(Temp - 0.5);
Temp := Temp - FLOAT_ITEM(Natural_Temp);
X_Initial := Temp;
return Temp;
end Random_Number;
end Random;
with Ada.Text_IO, Random;
use Ada.Text_IO;
procedure TestRan is
package My_Random is new Random(FLOAT);
use My_Random;
package Int_IO is new Ada.Text_IO.Integer_IO(INTEGER);
use Int_IO;
package Flt_IO is new Ada.Text_IO.Float_IO(FLOAT);
use Flt_IO;
SIZE : constant := 100;
type MY_ARRAY is array(1..SIZE) of INTEGER;
Events : MY_ARRAY;
Int_Rand : INTEGER;
begin
Set_Seed;
for Index in 1..2 loop
Put(Random_Number, 2, 6, 0);
end loop;
end TestRan;