| .TH RAND 3 |
| .SH NAME |
| rand, lrand, frand, nrand, lnrand, srand, truerand, ntruerand, fastrand, nfastrand \- random number generator |
| .SH SYNOPSIS |
| .B #include <u.h> |
| .br |
| .B #include <libc.h> |
| .PP |
| .ta \w'\fLdouble 'u |
| .B |
| int rand(void) |
| .PP |
| .B |
| long lrand(void) |
| .PP |
| .B |
| double frand(void) |
| .PP |
| .B |
| int nrand(int val) |
| .PP |
| .B |
| long lnrand(long val) |
| .PP |
| .B |
| void srand(long seed) |
| .PP |
| .B |
| ulong truerand(void) |
| .PP |
| .B |
| ulong ntruerand(ulong val) |
| .sp |
| .B #include <mp.h> |
| .br |
| .B #include <libsec.h> |
| .PP |
| .B |
| void genrandom(uchar *buf, int nbytes) |
| .PP |
| .B |
| void prng(uchar *buf, int nbytes) |
| .PP |
| .B |
| ulong fastrand(void) |
| .PP |
| .B |
| ulong nfastrand(ulong val) |
| .SH DESCRIPTION |
| .I Rand |
| returns a uniform pseudo-random |
| number |
| .IR x , |
| .RI 0≤ x <2\u\s715\s10\d. |
| .PP |
| .I Lrand |
| returns a uniform |
| .B long |
| .IR x , |
| .RI 0≤ x <2\u\s731\s10\d. |
| .PP |
| .I Frand |
| returns a uniform |
| .B double |
| .IR x , |
| .RI 0.0≤ x <1.0, |
| This function calls |
| .I lrand |
| twice to generate a number with as many as 62 significant bits of mantissa. |
| .PP |
| .I Nrand |
| returns a uniform integer |
| .IR x , |
| .RI 0≤ x < val. |
| .I Lnrand |
| is the same, but returns a |
| .BR long . |
| .PP |
| The algorithm is additive feedback with: |
| .IP |
| x[n] = (x[n\(mi273] + x[n\(mi607]) mod |
| .if t 2\u\s731\s0\d |
| .if n 2^31 |
| .LP |
| giving a period of |
| .if t 2\u\s730\s10\d \(mu (2\u\s7607\s10\d \- 1). |
| .if n 2^30 × (2^607 - 1). |
| .PP |
| The generators are initialized by calling |
| .I srand |
| with whatever you like as argument. |
| To get a different starting value each time, |
| .IP |
| .L |
| srand(time(0)) |
| .LP |
| will work as long as it is not called more often |
| than once per second. |
| Calling |
| .IP |
| .L |
| srand(1) |
| .LP |
| will initialize the generators to their |
| starting state. |
| .PP |
| .I Truerand |
| returns a random unsigned long read from |
| .BR /dev/random . |
| Due to the nature of |
| .BR /dev/random , |
| truerand can only return a few hundred bits a |
| second. |
| .PP |
| .I Ntruerand |
| returns a uniform random integer |
| .IR x , |
| .RI 0≤ x < val ≤ 2\u\s732\s10\d-1. |
| .PP |
| .I Genrandom |
| fills a buffer with bytes from the X9.17 pseudo-random |
| number generator. The X9.17 generator is seeded by 24 |
| truly random bytes read from |
| .BR /dev/random . |
| .PP |
| .I Prng |
| uses the native |
| .IR rand (3) |
| pseudo-random number generator to fill the buffer. Used with |
| .IR srand , |
| this function can produce a reproducible stream of pseudo random |
| numbers useful in testing. |
| .PP |
| Both |
| .I genrandom |
| and |
| .I prng |
| may be passed to |
| .I mprand |
| (see |
| .IR mp (3)). |
| .PP |
| .I Fastrand |
| uses |
| .I genrandom |
| to return a uniform |
| .B "unsigned long |
| .IR x , |
| .RI 0≤ x < 2\u\s732\s10\d-1. |
| .PP |
| .I Nfastrand |
| uses |
| .I genrandom |
| to return a uniform |
| .B "unsigned long |
| .IR x , |
| .RI 0≤ x < val ≤ 2\u\s732\s10\d-1. |
| .SH SOURCE |
| .B \*9/src/lib9 |
| .br |
| .B \*9/src/libsec/port |
| .SH "SEE ALSO |
| .\" .IR cons (3), |
| .IR mp (3) |
| .SH BUGS |
| .I Truerand |
| and |
| .I ntruerand |
| maintain a static file descriptor. |
| .PP |
| To avoid name conflicts with the underlying system, |
| .IR rand , |
| .IR lrand , |
| .IR frand , |
| .IR nrand , |
| .IR lnrand , |
| and |
| .I srand |
| are preprocessor macros defined as |
| .IR p9rand , |
| .IR p9lrand , |
| and so on; |
| see |
| .IR intro (3). |
| .ie \n(HT .ds HT " |
| .el .ds HT " (see HTML-formatted man page for link) |
| .PP |
| Some versions of SunOS do not ship with |
| .B /dev/random |
| installed. |
| You may have to download a |
| .HR "http://sunsolve.sun.com/search/document.do?assetkey=1-25-27606-1" "patch from Sun\*(HT" |
| to add it to your system. |