1.\" Copyright (c) 1993 Martin Birgmeier 2.\" All rights reserved. 3.\" 4.\" You may redistribute unmodified or modified versions of this source 5.\" code provided that the above copyright notice and this and the 6.\" following conditions are retained. 7.\" 8.\" This software is provided ``as is'', and comes with no warranties 9.\" of any kind. I shall in no event be liable for anything that happens 10.\" to anyone/anything when using this software. 11.\" 12.\" $OpenBSD: rand48.3,v 1.14 2014/01/21 23:25:03 deraadt Exp $ 13.\" 14.Dd $Mdocdate: January 21 2014 $ 15.Dt RAND48 3 16.Os 17.Sh NAME 18.Nm drand48 , 19.Nm erand48 , 20.Nm lrand48 , 21.Nm nrand48 , 22.Nm mrand48 , 23.Nm jrand48 , 24.Nm srand48 , 25.Nm seed48 , 26.Nm lcong48 27.Nd pseudo-random number generators and initialization routines 28.Sh SYNOPSIS 29.In stdlib.h 30.Ft double 31.Fn drand48 void 32.Ft double 33.Fn erand48 "unsigned short xseed[3]" 34.Ft long 35.Fn lrand48 void 36.Ft long 37.Fn nrand48 "unsigned short xseed[3]" 38.Ft long 39.Fn mrand48 void 40.Ft long 41.Fn jrand48 "unsigned short xseed[3]" 42.Ft void 43.Fn srand48 "long seed" 44.Ft "unsigned short *" 45.Fn seed48 "unsigned short xseed[3]" 46.Ft void 47.Fn lcong48 "unsigned short p[7]" 48.Sh DESCRIPTION 49The 50.Fn rand48 51family of functions generates pseudo-random numbers using a linear 52congruential algorithm working on integers 48 bits in size. 53The particular formula employed is 54r(n+1) = (a * r(n) + c) mod m 55where the default values are 56for the multiplicand a = 0xfdeece66d = 25214903917 and 57the addend c = 0xb = 11. 58The modulus is always fixed at m = 2 ** 48. 59r(n) is called the seed of the random number generator. 60.Pp 61For all the six generator routines described next, the first 62computational step is to perform a single iteration of the algorithm. 63.Pp 64.Fn drand48 65and 66.Fn erand48 67return values of type double. 68The full 48 bits of r(n+1) are 69loaded into the mantissa of the returned value, with the exponent set 70such that the values produced lie in the interval [0.0, 1.0]. 71.Pp 72.Fn lrand48 73and 74.Fn nrand48 75return values of type long in the range 76[0, 2**31-1]. 77The high-order (31) bits of 78r(n+1) are loaded into the lower bits of the returned value, with 79the topmost (sign) bit set to zero. 80.Pp 81.Fn mrand48 82and 83.Fn jrand48 84return values of type long in the range 85[-2**31, 2**31-1]. 86The high-order (32) bits of r(n+1) are loaded into the returned value. 87.Pp 88.Fn drand48 , 89.Fn lrand48 , 90and 91.Fn mrand48 92use an internal buffer to store r(n). 93For these functions 94the initial value of r(0) = 0x1234abcd330e = 20017429951246. 95.Pp 96On the other hand, 97.Fn erand48 , 98.Fn nrand48 , 99and 100.Fn jrand48 101use a user-supplied buffer to store the seed r(n), 102which consists of an array of 3 shorts, where the zeroth member 103holds the least significant bits. 104.Pp 105All functions share the same multiplicand and addend. 106.Pp 107.Fn srand48 108is used to initialize the internal buffer r(n) of 109.Fn drand48 , 110.Fn lrand48 , 111and 112.Fn mrand48 113such that the 32 bits of the seed value are copied into the upper 32 bits 114of r(n), with the lower 16 bits of r(n) arbitrarily being set to 0x330e. 115Additionally, the constant multiplicand and addend of the algorithm are 116reset to the default values given above. 117.Pp 118.Fn seed48 119also initializes the internal buffer r(n) of 120.Fn drand48 , 121.Fn lrand48 , 122and 123.Fn mrand48 , 124but here all 48 bits of the seed can be specified in an array of 3 shorts, 125where the zeroth member specifies the lowest bits. 126Again, the constant multiplicand and addend of the algorithm are 127reset to the default values given above. 128.Fn seed48 129returns a pointer to an array of 3 shorts which contains the old seed. 130This array is statically allocated, so its contents are lost after 131each new call to 132.Fn seed48 . 133.Pp 134Finally, 135.Fn lcong48 136allows full control over the multiplicand and addend used in 137.Fn drand48 , 138.Fn erand48 , 139.Fn lrand48 , 140.Fn nrand48 , 141.Fn mrand48 , 142and 143.Fn jrand48 , 144and the seed used in 145.Fn drand48 , 146.Fn lrand48 , 147and 148.Fn mrand48 . 149An array of 7 shorts is passed as parameter; the first three shorts are 150used to initialize the seed; the second three are used to initialize the 151multiplicand; and the last short is used to initialize the addend. 152It is thus not possible to use values greater than 0xffff as the addend. 153.Pp 154Note that all three methods of seeding the random number generator 155always also set the multiplicand and addend for any of the six 156generator calls. 157.Pp 158For a more powerful random number generator, see 159.Xr arc4random 3 . 160.Sh SEE ALSO 161.Xr arc4random 3 , 162.Xr rand 3 , 163.Xr random 3 164.Sh STANDARDS 165The 166.Fn drand48 , 167.Fn erand48 , 168.Fn jrand48 , 169.Fn lcong48 , 170.Fn lrand48 , 171.Fn mrand48 , 172.Fn nrand48 , 173.Fn seed48 , 174and 175.Fn srand48 176functions conform to 177.St -p1003.1-2008 . 178.Sh AUTHORS 179Martin Birgmeier 180