From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,34e3e7f96ab2aa27 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 1995-03-02 07:50:15 PST Path: nntp.gmd.de!stern.fokus.gmd.de!ceres.fokus.gmd.de!zib-berlin.de!news.mathworks.com!news.duke.edu!eff!blanket.mitre.org!linus.mitre.org!spectre!eachus From: eachus@spectre.mitre.org (Robert I. Eachus) Newsgroups: comp.lang.ada Subject: Re: Random numbers in Gnat Date: 02 Mar 1995 15:50:15 GMT Organization: The Mitre Corp., Bedford, MA. Message-ID: References: <3j2q9t$s3n@solar.Armstrong.EDU> NNTP-Posting-Host: spectre.mitre.org In-reply-to: ab@captblood.armstrong.edu's message of 1 Mar 1995 21:51:57 GMT Date: 1995-03-02T15:50:15+00:00 List-Id: In article <3j2q9t$s3n@solar.Armstrong.EDU> ab@captblood.armstrong.edu () writes: > with text_io; use text_io; > with ada.numerics.random; use ada.numerics.random; > procedure randtest is > package int_io is new integer_io(integer); use int_io; > rand_state: state:= make_state; -- This initialization is wrong! The GNAT people will have to figure -- out why it got through. It seems to be a call to the function -- Make_State in the private package Ada.Numerics.Random. > -- return random number in 0..up_bound > function my_random(up_bound: integer) return integer is > r: Uniformly_Distributed; > begin > random( rand_state, r); > return integer(r*float(up_bound)); > end my_random; > begin -- At this point you can insert a call to Reset, in theory it is not -- needed, but the current generator seems to have some problems with -- degenerate seeds. I used: Reset(rand_state, 1234); > for i in 1..10 loop > put(my_random(1000)); new_line; > end loop; > end randtest; -- Under separate cover I'll send you a better generator. ;-) > The program prints out only zeros rather than 10 random numbers in the > 0..1000 range. I dislike the use of the global rand_state variable. > However using it as a parameter is no better either. Indeed, why > should one be bothered with this quantity anyway? (In C one > just seeds the generator, and then calls the random() as a > parameterless function, why not here?) -- Because there is a serious issue involving tasking. There are two -- solutions in the tasking case: a single state with atomic updates, -- or a state per task. The solution chosen was to allow the Ada -- language to be used and not force the wrong choice on users. In -- the non-tasking case, a pair of declarations like: My_Gen: Ada.Numerics.Float_Random.Generator; function Rand(Gen: in Ada.Numerics.Float_Random.Generator := My_Gen) return Ada.Numerics.Float_Random.Uniformly_Distributed renames Ada.Numerics.Float_Random.Random; -- And all the heavy breathing is in one place. (This particular -- example does make a powerful argument for use clauses though.) > I'll appreciate your discussion as to how the random number > generator should be used. Pointers to some documentation/discussion > of the objects in a-numran.ads would also be helpful. -- Also by e-mail I'll send some documentation of how the generator I -- use works. -- Robert I. Eachus with Standard_Disclaimer; use Standard_Disclaimer; function Message (Text: in Clever_Ideas) return Better_Ideas is...