summaryrefslogtreecommitdiffstats
path: root/man3p/rand.3p
diff options
context:
space:
mode:
Diffstat (limited to 'man3p/rand.3p')
-rw-r--r--man3p/rand.3p181
1 files changed, 181 insertions, 0 deletions
diff --git a/man3p/rand.3p b/man3p/rand.3p
new file mode 100644
index 000000000..9c62699b1
--- /dev/null
+++ b/man3p/rand.3p
@@ -0,0 +1,181 @@
+.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved
+.TH "RAND" P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual"
+.\" rand
+.SH NAME
+rand, rand_r, srand \- pseudo-random number generator
+.SH SYNOPSIS
+.LP
+\fB#include <stdlib.h>
+.br
+.sp
+int rand(void);
+.br
+\fP
+.LP
+\fBint rand_r(unsigned *\fP\fIseed\fP\fB); \fP
+\fB
+.br
+void srand(unsigned\fP \fIseed\fP\fB);
+.br
+\fP
+.SH DESCRIPTION
+.LP
+The \fIrand\fP() function shall compute a sequence of pseudo-random
+integers in the range [0, {RAND_MAX}] \ with a
+period of at least 2**32.
+.LP
+The
+\fIrand\fP() function need not be reentrant. A function that is not
+required to be reentrant is not required to be thread-safe.
+.LP
+The \fIrand_r\fP() function shall compute a sequence of pseudo-random
+integers in the range [0, {RAND_MAX}]. (The value of the
+{RAND_MAX} macro shall be at least 32767.)
+.LP
+If \fIrand_r\fP() is called with the same initial value for the object
+pointed to by \fIseed\fP and that object is not
+modified between successive returns and calls to \fIrand_r\fP(), the
+same sequence shall be generated.
+.LP
+The \fIsrand\fP() function uses the argument as a seed for a new sequence
+of pseudo-random numbers to be returned by subsequent
+calls to \fIrand\fP(). If \fIsrand\fP() is then called with the same
+seed value, the sequence of pseudo-random numbers shall be
+repeated. If \fIrand\fP() is called before any calls to \fIsrand\fP()
+are made, the same sequence shall be generated as when
+\fIsrand\fP() is first called with a seed value of 1.
+.LP
+The implementation shall behave as if no function defined in this
+volume of IEEE\ Std\ 1003.1-2001 calls \fIrand\fP()
+or \fIsrand\fP().
+.SH RETURN VALUE
+.LP
+The \fIrand\fP() function shall return the next pseudo-random number
+in the sequence.
+.LP
+The \fIrand_r\fP() function shall return a pseudo-random integer.
+.LP
+The \fIsrand\fP() function shall not return a value.
+.SH ERRORS
+.LP
+No errors are defined.
+.LP
+\fIThe following sections are informative.\fP
+.SH EXAMPLES
+.SS Generating a Pseudo-Random Number Sequence
+.LP
+The following example demonstrates how to generate a sequence of pseudo-random
+numbers.
+.sp
+.RS
+.nf
+
+\fB#include <stdio.h>
+#include <stdlib.h>
+\&...
+ long count, i;
+ char *keystr;
+ int elementlen, len;
+ char c;
+\&...
+/* Initial random number generator. */
+ srand(1);
+.sp
+
+ /* Create keys using only lowercase characters */
+ len = 0;
+ for (i=0; i<count; i++) {
+ while (len < elementlen) {
+ c = (char) (rand() % 128);
+ if (islower(c))
+ keystr[len++] = c;
+ }
+.sp
+
+ keystr[len] = '\\0';
+ printf("%s Element%0*ld\\n", keystr, elementlen, i);
+ len = 0;
+ }
+\fP
+.fi
+.RE
+.SS Generating the Same Sequence on Different Machines
+.LP
+The following code defines a pair of functions that could be incorporated
+into applications wishing to ensure that the same
+sequence of numbers is generated across different machines.
+.sp
+.RS
+.nf
+
+\fBstatic unsigned long next = 1;
+int myrand(void) /* RAND_MAX assumed to be 32767. */
+{
+ next = next * 1103515245 + 12345;
+ return((unsigned)(next/65536) % 32768);
+}
+.sp
+
+void mysrand(unsigned seed)
+{
+ next = seed;
+}
+\fP
+.fi
+.RE
+.SH APPLICATION USAGE
+.LP
+The \fIdrand48\fP() function provides a much more elaborate random
+number
+generator.
+.LP
+The limitations on the amount of state that can be carried between
+one function call and another mean the \fIrand_r\fP()
+function can never be implemented in a way which satisfies all of
+the requirements on a pseudo-random number generator. Therefore
+this function should be avoided whenever non-trivial requirements
+(including safety) have to be fulfilled.
+.SH RATIONALE
+.LP
+The ISO\ C standard \fIrand\fP() and \fIsrand\fP() functions allow
+per-process pseudo-random streams shared by all
+threads. Those two functions need not change, but there has to be
+mutual-exclusion that prevents interference between two threads
+concurrently accessing the random number generator.
+.LP
+With regard to \fIrand\fP(), there are two different behaviors that
+may be wanted in a multi-threaded program:
+.IP " 1." 4
+A single per-process sequence of pseudo-random numbers that is shared
+by all threads that call \fIrand\fP()
+.LP
+.IP " 2." 4
+A different sequence of pseudo-random numbers for each thread that
+calls \fIrand\fP()
+.LP
+.LP
+This is provided by the modified thread-safe function based on whether
+the seed value is global to the entire process or local
+to each thread.
+.LP
+This does not address the known deficiencies of the \fIrand\fP() function
+implementations, which have been approached by
+maintaining more state. In effect, this specifies new thread-safe
+forms of a deficient function.
+.SH FUTURE DIRECTIONS
+.LP
+None.
+.SH SEE ALSO
+.LP
+\fIdrand48\fP() , the Base Definitions volume of IEEE\ Std\ 1003.1-2001,
+\fI<stdlib.h>\fP
+.SH COPYRIGHT
+Portions of this text are reprinted and reproduced in electronic form
+from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
+-- Portable Operating System Interface (POSIX), The Open Group Base
+Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
+Electrical and Electronics Engineers, Inc and The Open Group. In the
+event of any discrepancy between this version and the original IEEE and
+The Open Group Standard, the original IEEE and The Open Group Standard
+is the referee document. The original Standard can be obtained online at
+http://www.opengroup.org/unix/online.html .