Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ drand48(3) — AIX/RT 2.2.1

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

rand, srand

drand48

Purpose

     Generates  uniformly   distributed  pseudo-random  number
     sequences.

Library

     Standard C Library (libc.a)

Syntax

     double drand48 ( )                        long jrand48 (xsubi)
                                               unsigned short xsubi[3|;
     double erand48 (xsubi)
     unsigned short xsubi[3|;                  void srand48 (seedval)
                                               long seedval;
     long lrand48 ( )
                                               unsigned short *seed48 (seed16v)
     long nrand48 (xsubi)                      unsigned short seed16v[3|;
     unsigned short xsubi[3|;
                                               void lcong48 (param)
     long mrand48 ( );                         unsigned short param[7|;
     Description

     This  family   of  subroutines   generates  pseudo-random
     numbers  using  the  linear  congruential  algorithm  and
     48-bit integer arithmetic.

     The  drand48 and  erand48 subroutines  return nonnegative
     double-precision floating-point values uniformly distrib-
     uted over the range of y values such that 0.0 < y < 1.0.

     The  lrand48 and  nrand48 subroutines  return nonnegative
     long integers  uniformly distributed over the  range of y
     values such that 0 < y < 2(31).

     The mrand48  and jrand48  subroutines return  signed long
     integers uniformly distributed over the range of y values
     such that -2(31) < y < 2(31).

     The srand48,  seed48 and lcong48  subroutines initialize,
     the random-number generator.   Programs should invoke one
     of  them  before  calling drand48,  lrand48  or  mrand48.
     (Although  it  is   not  recommended  practice,  constant
     default initializer values  are supplied automatically if
     the drand48,  lrand48 or  mrand48 subroutines  are called
     without first calling an initialization subroutine.)  The
     erand48, nrand48  and jrand48 subroutines do  not require
     that an initialization subroutine to be called first.

     All  the subroutines  work  by generating  a sequence  of
     48-bit  integer values,  X[i],  according  to the  linear
     congruential formula:

      X sub <n + 1> = (aX sub n + c) sub <mod m> %%%% n ge 0

     The parameter m =  2(48); hence 48-bit integer arithmetic
     is  performed.  Unless  the lcong48  subroutine has  been
     called, the  multiplier value  a and  the addend  value c
     are:

           a = '5DEECE66D' sub 16 = '273673163155' sub 8

                    c = 'B' sub 16 = '13' sub 8

     The  value returned  by  the  drand48, erand48,  lrand48,
     nrand48, mrand48, and jrand48  subroutines is computed by
     first generating  the next  48-bit X[i] in  the sequence.
     Then  the appropriate  number of  bits, according  to the
     type of  data item  to be returned,  are copied  from the
     high-order  (most significant)  bits of  X[i] and  trans-
     formed into the returned value.

     The drand48,  lrand48 and  mrand48 subroutines  store the
     last 48-bit X[i] generated  into an internal buffer; that
     is why they must be initialized prior to being invoked.

     The erand48, nrand48 and  jrand48 subroutines require the
     calling  program to  provide storage  for the  successive
     X[i] values in  the array pointed to by  the xsubi param-
     eter.  That is why these routines  do not have to be ini-
     tialized;  the calling  program merely  has to  place the
     desired initial value of X[i]  into the array and pass it
     as a parameter.

     By using different parameters,  the erand48, nrand48, and
     jrand48  subroutines allow  separate modules  of a  large
     program  to  generate  several independent  sequences  of
     pseudo-random numbers.   In other words, the  sequence of
     numbers that  one module  generates does not  depend upon
     how  many  times  the  subroutines are  called  by  other
     modules.

     The initializer subroutine srand48 sets the high-order 32
     bits of X[i]  to the 32 bits contained  in its parameter.
     The low  order 16 bits of  X[i] are set to  the arbitrary
     value 330E[16].

     The initializer subroutine seed48  sets the value of X[i]
     to the 48-bit value specified  in the array pointed to by
     the  seed16v parameter.   In addition,  seed48 returns  a
     pointer  to a  48-bit internal  buffer that  contains the
     previous value  of X[i].   that is  used only  by seed48.
     The returned  pointer allows  you to restart  the pseudo-
     random sequence  at a  given point.   Use the  pointer to
     copy  the previous  X[i]  value into  a temporary  array.
     Later you can call seed48 with a pointer to this array to
     resume where the original sequence left off.

     The lcong48 subroutine specifies  the initial X[i] value,
     the  multiplier value  a, and  the addend  value c.   The
     parameter   array  elements   param[0-2]  specify   X[i],
     param[3-5] specify the multiplier  a, and param[6] speci-
     fies the 16-bit addend c.  After lcong48 has been called,

     a subsequent  call to  either srand48 or  seed48 restores
     the standard a and c as specified previously.

     Related Information

     In this book:  "rand, srand."

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026