-- D? has a type that has the range of 3..18 -- Random return a type that has the range of 1..6 -- So, when Random returns 1..2 => Constraint_Error -- using D? := Random(G)*3; fixes the problem. -- with Ada.Text_IO, Ada.Integer_Text_IO; with Ada.Numerics.Discrete_Random; procedure test is subtype Die is Integer range 1..6; --Declare that anything of type Die may be --an integer, value between 1 and 6, inclusive, and sod-all else. subtype Dice is Integer range 3*Die'First .. 3*Die'Last; --Declares that Dice may be anything from 3 to 18. package Random_Die is new Ada.Numerics.Discrete_Random (Die); use Random_Die; --Random generator; produces an integer between 1 and 6 sum : Integer := 0; G: Generator; D1 : Dice; D2 : Dice; D3 : Dice; D4 : Dice; --Declare four Dice begin Reset(G); D1 := Random(G)*3; D2 := Random(G)*3; D3 := Random(G)*3; D4 := Random(G)*3; sum := D1 + D2 + D3 + D4; --Debugging Ada.Integer_Text_IO.Put(D1); Ada.Integer_Text_IO.Put(D2); Ada.Integer_Text_IO.Put(D3); Ada.Integer_Text_IO.Put(D4); Ada.Integer_Text_IO.Put(sum); end test; In <474531FD.5090401@free.fr>, Damien Carbonne writes: >DarthBob88 a �crit : >> I've been trying to write a program that creates four random numbers, >> to simulate four dice rolling; a D&D simulator, in fact. >> Unfortunately, I occasionally get "raised CONSTRAINT_ERROR : test.adb: >> 22 range check failed" (line 22 is one of the lines to generate a >> random number; it varies between the four). I have been trying to find >> information on how to prevent this error, but I can't find anything >> about it. I'm extremely new to this language, as in I only started >> last week new, so any help would be greatly appreciated. Here follows >> my code, warts and all. >> >> with Ada.Text_IO, Ada.Integer_Text_IO; >> with Ada.Numerics.Discrete_Random; >> >> procedure test is >> subtype Die is Integer range 1..6; >> --Declare that anything of type Die may be >> --an integer, value between 1 and 6, inclusive, and sod-all else. >> subtype Dice is Integer range 3*Die'First .. 3*Die'Last; >> --Declares that Dice may be anything from 3 to 18. >> package Random_Die is new Ada.Numerics.Discrete_Random (Die); >Here you instantiate Discrete_Random with Die. >Change Die to Dice, it should work. >> use Random_Die; >> --Random generator; produces an integer between 1 and 6 >> sum : Integer := 0; >> G: Generator; >> D1 : Dice; >> D2 : Dice; >> D3 : Dice; >> D4 : Dice; >> --Declare four Dice >> begin >> Reset(G); >> D1 := Random(G); >> D2 := Random(G); >> D3 := Random(G); >> D4 := Random(G); >Here, Random should have been instantiated with Dice. >> --I Haven't found the error just yet, but a Constraint_Error >> --Occasionally comes up for the previous 4 lines >> --I haven't been able to find it online, but I presume >> --It's because the generator comes up with a number outside of [1,6] >> sum := D1 + D2 + D3 + D4; >> --Debugging >> Ada.Integer_Text_IO.Put(D1); >> Ada.Integer_Text_IO.Put(D2); >> Ada.Integer_Text_IO.Put(D3); >> Ada.Integer_Text_IO.Put(D4); >> Ada.Integer_Text_IO.Put(sum); >> end test; >> --compile Ada programs with gnat make .adb >> >> If it helps any, I'm using the Windows version of GNAT on XP. Thanks >> in advance.