comp.lang.ada
 help / color / mirror / Atom feed
From: stt@henning.camb.inmet.com (Tucker Taft)
Subject: Re: Random numbers in Gnat
Date: Fri, 3 Mar 1995 15:08:43 GMT
Date: 1995-03-03T15:08:43+00:00	[thread overview]
Message-ID: <D4vE2J.G88@inmet.camb.inmet.com> (raw)
In-Reply-To: 3j2q9t$s3n@solar.Armstrong.EDU

ab@captblood.armstrong.edu wrote:

: I cannot find any discussion of the use of random() procedure
: in gnat-2.03 Unix version for SunOS 4.1.3. The only information
: that I found is in file a-numran.ads, and as the following
: shows I must have misunderstood the intent and use of the objects
: in that file.

: Here is a little test that I've concocted:

:         with text_io; use text_io;
: 		with ada.numerics.random; use ada.numerics.random;

In the final Ada 95 version, there are two random-number
packages, "Float_Random" and "Discrete_Random" (actually,
Discrete_Random is a generic package).
Float_Random is pretty much a direct replacement for the earlier
"Random."  Discrete_Random would actually do just what you
want without your having to fiddle with floating point.

: 		procedure randtest is
:           package int_io is new integer_io(integer); use int_io;

: 		  rand_state: state:= make_state;

This is called "Generator" in the final version.  "State" is
just used for saving and restoring the state of a generator.
So this would be:

                  Rand_Generator : Generator;

:           -- return random number in 0..up_bound
:           function my_random(up_bound: integer) return integer is
:                 r: Uniformly_Distributed;
:           begin
:                 random( rand_state, r);

Random is now a function in Float_Random.  So this
would be "R := Random(Rand_Generator);

:                 return integer(r*float(up_bound));

Conversion to Integer rounds, so you will not get a perfectly
uniform distribution with this.  0 and up_bound will each occur
half as often as the values between then.  Perhaps that is
what you wanted anyway.  

Ada 95 also has functions that will truncate (without 
conversion), and you can then convert after truncation.  
E.g. Integer(Float'Truncation(R * Float(Up_Bound))).
In this case, 0 will be as likely to occur as 1..Up_Bound-1,
and Up_Bound itself will almost never occur.  You can
use "mod" to ensure that Up_Bound never occurs (and then
you can eliminate the call on Float'Truncation as well).
Because this whole area of producing a discrete uniform distribution
is a bit subtle, Ada 95 includes a generic package
designed just for that.  See Discrete_Random in RM A.5.2.

:           end my_random;          
:         begin
:           for i in 1..10 loop
:                 put(my_random(1000)); new_line;
:           end loop;
:         end randtest;

: 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?)

The important thing to remember is that Ada is a multitasking
language.  If there is global state (like the current random number
generator), then you get into problems if multiple tasks reference
it.  Hence, we have tried to avoid having "implicit" state in
language-defined packages ("Text_IO.Current_Input/Output" are 
exceptions to this, for historical reasons), but instead require the
programmer to declare and pass explicitly in state such as
a random number generator.

Note that you can create your own package with a 
parameterless random number function if you want,
either by presuming there are not going to be multiple tasks, 
or by using a protected object to guard the global generator, or 
by using the Task_Attributes package to create a separate 
generator for each task.

: 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.

The Ada 95 Reference Manual, subclause A.5.2, is the best
place to look.  The final reference manual is available
online at sw-eng.falls-church.va.us via anonymous FTP in directory
public/adaic/docs/standard/95lrm_rat/v6.0

: Dr. A.Bykat
: Fuller E. Callaway Professor

-Tucker Taft  stt@inmet.com
Intermetrics, Inc.



      parent reply	other threads:[~1995-03-03 15:08 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1995-03-01 21:51 Random numbers in Gnat ab
1995-03-02  8:31 ` Dave Marshall
1995-03-03 19:11   ` Robert Dewar
1995-03-02 15:50 ` Robert I. Eachus
1995-03-03 15:08 ` Tucker Taft [this message]
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox