# View Source random (stdlib v6.0.1)

Pseudo-random number generation.

This module provides a random number generator. The method is attributed to B.A. Wichmann and I.D. Hill in 'An efficient and portable pseudo-random number generator', Journal of Applied Statistics. AS183. 1982. Also Byte March 1987.

The algorithm is a modification of the version attributed to Richard A. O'Keefe in the standard Prolog library.

Every time a random number is requested, a state is used to calculate it, and a
new state is produced. The state can either be implicit (kept in the process
dictionary) or be an explicit argument and return value. In this implementation,
the state (the type `ran/0`

) consists of a tuple of three integers.

## Note

This random number generator is not cryptographically strong. If a strong cryptographic random number generator is needed, use one of functions in the

`crypto`

module, for example,`crypto:strong_rand_bytes/1`

.

## Note

The improved

`rand`

module is to be used instead of this module.

## Note

Some of the functions use the process dictionary variable `random_seed`

to
remember the current seed.

If a process calls `uniform/0`

or `uniform/1`

without setting a seed first,
`seed/0`

is called automatically.

The implementation changed in Erlang/OTP R15. Upgrading to R15 breaks
applications that expect a specific output for a specified seed. The output is
still deterministic number series, but different compared to releases older than
R15. Seed `{0,0,0}`

does, for example, no longer produce a flawed series of only
zeros.

# Summary

## Functions

Returns the default state.

Seeds random number generation with default (fixed) values in the process dictionary and returns the old state.

`seed({A1, A2, A3})`

is equivalent to
`seed(A1, A2, A3)`

.

Seeds random number generation with integer values in the process dictionary and returns the old state.

Returns a random float uniformly distributed between `0.0`

and `1.0`

, updating
the state in the process dictionary.

Returns, for a specified integer `N >= 1`

, a random integer uniformly
distributed between `1`

and `N`

, updating the state in the process dictionary.

Returns, for a specified state, a random float uniformly distributed between
`0.0`

and `1.0`

, and a new state.

Returns, for a specified integer `N >= 1`

and a state, a random integer
uniformly distributed between `1`

and `N`

, and a new state.

# Types

The state.

# Functions

-spec seed0() -> ran().

Returns the default state.

-spec seed() -> ran().

Seeds random number generation with default (fixed) values in the process dictionary and returns the old state.

-spec seed(SValue) -> undefined | ran() when SValue :: {A1, A2, A3} | integer(), A1 :: integer(), A2 :: integer(), A3 :: integer().

`seed({A1, A2, A3})`

is equivalent to
`seed(A1, A2, A3)`

.

Seeds random number generation with integer values in the process dictionary and returns the old state.

The following is an easy way of obtaining a unique value to seed with:

```
random:seed(erlang:phash2([node()]),
erlang:monotonic_time(),
erlang:unique_integer())
```

For details, see `erlang:phash2/1`

, `erlang:node/0`

, `erlang:monotonic_time/0`

,
and `erlang:unique_integer/0`

.

-spec uniform() -> float().

Returns a random float uniformly distributed between `0.0`

and `1.0`

, updating
the state in the process dictionary.

-spec uniform(N) -> pos_integer() when N :: pos_integer().

Returns, for a specified integer `N >= 1`

, a random integer uniformly
distributed between `1`

and `N`

, updating the state in the process dictionary.

Returns, for a specified state, a random float uniformly distributed between
`0.0`

and `1.0`

, and a new state.

-spec uniform_s(N, State0) -> {integer(), State1} when N :: pos_integer(), State0 :: ran(), State1 :: ran().

Returns, for a specified integer `N >= 1`

and a state, a random integer
uniformly distributed between `1`

and `N`

, and a new state.