Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
DRAND48(3)	       FreeBSD Library Functions Manual		    DRAND48(3)

     drand48, erand48, lrand48,	nrand48, mrand48, jrand48, srand48,
     srand48_deterministic, seed48, seed48_deterministic, lcong48,
     lcong48_deterministic -- pseudo-random number generators and initializa-
     tion routines

     #include <stdlib.h>


     erand48(unsigned short xseed[3]);


     nrand48(unsigned short xseed[3]);


     jrand48(unsigned short xseed[3]);

     srand48(long seed);

     srand48_deterministic(long	seed);

     unsigned short *
     seed48(unsigned short xseed[3]);

     unsigned short *
     seed48_deterministic(unsigned short xseed[3]);

     lcong48(unsigned short p[7]);

     lcong48_deterministic(unsigned short p[7]);

     Standards insist that this	interface return deterministic results.	 Un-
     safe usage	is very	common,	so OpenBSD changed the subsystem to return
     non-deterministic results by default.

     To	satisfy	portable code, srand48(), seed48(), or lcong48() should	be
     called to initialize the subsystem.  In OpenBSD the seeding parameters
     are ignored, and strong random number results will	be provided from
     arc4random(3).  In	other systems, the parameters prime a simplistic de-
     terministic algorithm.

     If	the standardized behavior is required then srand48_deterministic(),
     seed48_deterministic(), and lcong48_deterministic() can be	substituted
     for srand48(), seed48(), and lcong48().  That will	cause subsequent calls
     to	drand48(), lrand48(), and jrand48() to return results using the	deter-
     ministic algorithm.

     drand48() and erand48() return values of type double.  The	full 48	bits
     of	r(n+1) are loaded into the mantissa of the returned value, with	the
     exponent set such that the	values produced	lie in the interval [0.0,

     lrand48() and nrand48() return values of type long	in the range [0,
     2**31-1].	The high-order (31) bits of r(n+1) are loaded into the lower
     bits of the returned value, with the topmost (sign) bit set to zero.

     mrand48() and jrand48() return values of type long	in the range [-2**31,
     2**31-1].	The high-order (32) bits of r(n+1) are loaded into the re-
     turned value.

     In	the deterministic mode,	the rand48() family of functions generates
     numbers using a linear congruential algorithm working on integers 48 bits
     in	size.  The particular formula employed is r(n+1) = (a *	r(n) + c) mod
     m where the default values	are for	the multiplicand a = 0xfdeece66d =
     25214903917 and the addend	c = 0xb	= 11.  The modulus is always fixed at
     m = 2 ** 48.  r(n)	is called the seed of the random number	generator.

     For all the six generator routines	described next,	the first computa-
     tional step is to perform a single	iteration of the algorithm.

     drand48(),	lrand48(), and mrand48() use an	internal buffer	to store r(n).
     For these functions the initial value of r(0) = 0x1234abcd330e =

     On	the other hand,	erand48(), nrand48(), and jrand48() use	a user-sup-
     plied buffer to store the seed r(n), which	consists of an array of	3
     shorts, where the zeroth member holds the least significant bits.

     All functions share the same multiplicand and addend.

     srand48_deterministic() is	used to	initialize the internal	buffer r(n) of
     drand48(),	lrand48(), and mrand48() such that the 32 bits of the seed
     value are copied into the upper 32	bits of	r(n), with the lower 16	bits
     of	r(n) arbitrarily being set to 0x330e.  Additionally, the constant mul-
     tiplicand and addend of the algorithm are reset to	the default values
     given above.

     seed48_deterministic() also initializes the internal buffer r(n) of
     drand48(),	lrand48(), and mrand48(), but here all 48 bits of the seed can
     be	specified in an	array of 3 shorts, where the zeroth member specifies
     the lowest	bits.  Again, the constant multiplicand	and addend of the al-
     gorithm are reset to the default values given above.
     seed48_deterministic() returns a pointer to an array of 3 shorts which
     contains the old seed.  This array	is statically allocated, so its	con-
     tents are lost after each new call	to seed48_deterministic().

     Finally, lcong48_deterministic() allows full control over the multipli-
     cand and addend used in drand48(),	erand48(), lrand48(), nrand48(),
     mrand48(),	and jrand48(), and the seed used in drand48(), lrand48(), and
     mrand48().	 An array of 7 shorts is passed	as parameter; the first	three
     shorts are	used to	initialize the seed; the second	three are used to ini-
     tialize the multiplicand; and the last short is used to initialize	the
     addend.  It is thus not possible to use values greater than 0xffff	as the

     Note that all three methods of seeding the	random number generator	always
     also set the multiplicand and addend for any of the six generator calls.

     arc4random(3), rand(3), random(3)

     The drand48(), erand48(), jrand48(), lrand48(), mrand48(),	and nrand48(),
     functions conform to IEEE Std 1003.1-2008 ("POSIX.1").

     The seed48(), srand48(), and lcong48() function do	not conform to ANSI
     X3.159-1989 ("ANSI	C89"), intentionally.

     The seed48_deterministic(), srand48_deterministic(), and
     lcong48_deterministic() functions are OpenBSD extensions.

     Martin Birgmeier

FreeBSD	13.0		       December	20, 2019		  FreeBSD 13.0


Want to link to this manual page? Use this URL:

home | help