---
name: "srandom"
section: "9freebsd"
platform: "linux"
package: "freebsd-manpages"
version: "12.2-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/arc4rand/9freebsd"
---

# srandom(9freebsd)

supply pseudo-random numbers

Part of [arc4rand(9freebsd)](/arc4rand/9freebsd.md).

## NAME

**arc4rand**, **arc4random**, **random**, **read\_random**, **read\_random\_uio**, **srandom** – supply pseudo-random numbers

## SYNOPSIS

**#include \<sys/libkern.h\>**

*void*\

**srandom**(*u\_long seed*);

*u\_long*\

**random**(*void*);

*void*\

**arc4rand**(*void \*ptr*, *u\_int length*, *int reseed*);

*uint32\_t*\

**arc4random**(*void*);

**#include \<sys/random.h\>**

*int*\

**read\_random**(*void \*buffer*, *int count*);

*int*\

**read\_random\_uio**(*struct uio \*uio*, *bool nonblock*);

## DESCRIPTION

The **random**() function will by default produce a sequence of numbers that can be duplicated by calling **srandom**() with some constant as the *seed*. The **srandom**() function may be called with any arbitrary *seed* value to get slightly more unpredictable numbers. It is important to remember that the **random**() function is entirely predictable, and is therefore not of use where knowledge of the sequence of numbers may be of benefit to an attacker.

The **arc4rand**() function will return very good quality random numbers, better suited for security-related purposes. The random numbers from **arc4rand**() are seeded from the entropy device if it is available. Automatic reseeds happen after a certain timeinterval and after a certain number of bytes have been delivered. A forced reseed can be forced by passing a non-zero value in the *reseed* argument.

The **read\_random**() function is used to return entropy directly from the entropy device if it has been loaded. If the entropy device is not loaded, then the *buffer* is ignored and zero is returned. The *buffer* is filled with no more than *count* bytes. It is strongly advised that **read\_random**() is not used; instead use **arc4rand**() unless it is necessary to know that no entropy has been returned.

The **read\_random\_uio**() function behaves identically to [read(2)](/read/2.md) on */dev/random*. The *uio* argument points to a buffer where random data should be stored. This function only returns data if the random device is seeded. It blocks if unseeded, except when the *nonblock* argument is true.

All the bits returned by **random**(), **arc4rand**(), **read\_random**(), and **read\_random\_uio**() are usable. For example, ‘random()&01’ will produce a random binary value.

The **arc4random**() is a convenience function which calls **arc4rand**() to return a 32 bit pseudo-random integer.

## RETURN VALUES

The **random**() function uses a non-linear additive feedback random number generator employing a default table of size 31 containing 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 **arc4rand**() function uses the RC4 algorithm to generate successive pseudo-random bytes. The **arc4random**() function uses **arc4rand**() to generate pseudo-random numbers in the range from 0 to (2\*\*32)−1.

The **read\_random**() function returns the number of bytes placed in *buffer*.

**read\_random\_uio**() returns zero when successful, otherwise an error code is returned.

## ERRORS

**read\_random\_uio**() may fail if:

- \[EFAULT\]

  *uio* points to an invalid memory region.

- \[EWOULDBLOCK\]

  The random device is unseeded and *nonblock* is true.

## AUTHORS

Dan Moschuk wrote **arc4random**(). Mark R V Murray wrote **read\_random**().
