Manpages - random.3

Table of Contents

NAME

random, srandom, initstate, setstate - random number generator

SYNOPSIS

  #include <stdlib.h>

  long random(void);
  void srandom(unsigned int seed);

  char *initstate(unsigned int seed, char *state, size_t n);
  char *setstate(char *state);

Feature Test Macro Requirements for glibc (see *feature_test_macros*(7)):

*random*(), *srandom*(), *initstate*(), *setstate*():

      _XOPEN_SOURCE >= 500
          || /* Glibc since 2.19: */ _DEFAULT_SOURCE
          || /* Glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE

DESCRIPTION

The *random*() function uses a nonlinear additive feedback random number generator employing a default table of size 31 long integers to return successive pseudo-random numbers in the range from 0 to 2^31 - 1. The period of this random number generator is very large, approximately /16

((2^31) - 1)/.

The *srandom*() function sets its argument as the seed for a new sequence of pseudo-random integers to be returned by *random*(). These sequences are repeatable by calling *srandom*() with the same seed value. If no seed value is provided, the *random*() function is automatically seeded with a value of 1.

The *initstate*() function allows a state array state to be initialized for use by *random*(). The size of the state array n is used by *initstate*() to decide how sophisticated a random number generator it should use—the larger the state array, the better the random numbers will be. Current “optimal” values for the size of the state array n are 8, 32, 64, 128, and 256 bytes; other amounts will be rounded down to the nearest known amount. Using less than 8 bytes results in an error. seed is the seed for the initialization, which specifies a starting point for the random number sequence, and provides for restarting at the same point.

The *setstate*() function changes the state array used by the *random*() function. The state array state is used for random number generation until the next call to *initstate*() or *setstate*(). state must first have been initialized using *initstate*() or be the result of a previous call of *setstate*().

RETURN VALUE

The *random*() function returns a value between 0 and (2^31) - 1. The *srandom*() function returns no value.

The *initstate*() function returns a pointer to the previous state array. On failure, it returns NULL, and errno is set to indicate the error.

On success, *setstate*() returns a pointer to the previous state array. On failure, it returns NULL, and errno is set to indicate the error.

ERRORS

EINVAL
The state argument given to *setstate*() was NULL.
EINVAL
A state array of less than 8 bytes was specified to *initstate*().

ATTRIBUTES

For an explanation of the terms used in this section, see *attributes*(7).

Interface Attribute Value
*random*(), *srandom*(), *initstate*(), *setstate*() Thread safety MT-Safe

CONFORMING TO

POSIX.1-2001, POSIX.1-2008, 4.3BSD.

NOTES

The *random*() function should not be used in multithreaded programs where reproducible behavior is required. Use *random_r*(3) for that purpose.

Random-number generation is a complex topic. Numerical Recipes in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New York: Cambridge University Press, 2007, 3rd ed.) provides an excellent discussion of practical random-number generation issues in Chapter 7 (Random Numbers).

For a more theoretical discussion which also covers many practical issues in depth, see Chapter 3 (Random Numbers) in Donald E. Knuth’s The Art of Computer Programming, volume 2 (Seminumerical Algorithms), 2nd ed.; Reading, Massachusetts: Addison-Wesley Publishing Company, 1981.

BUGS

According to POSIX, *initstate*() should return NULL on error. In the glibc implementation, errno is (as specified) set on error, but the function does not return NULL.

SEE ALSO

*getrandom*(2), *drand48*(3), *rand*(3), *random_r*(3), *srand*(3)

COLOPHON

This page is part of release 5.13 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, can be found at https://www.kernel.org/doc/man-pages/.

Author: dt

Created: 2022-02-20 Sun 18:39