# Random Numbers

Torch provides accurate mathematical random generation, based on Mersenne Twister random number generator.

## Generator handling

All of the below functions, as well as randn(), rand() and randperm(), take as optional first argument a random number generator. If this argument is not provided, the default global RNG is used.

A non-global RNG can be obtained with Generator(). Each RNG has its own state, independent from all other RNG's states.

```
-- Seed the global RNG
> torch.manualSeed(0)
> torch.random()
2357136044
-- Creates and seed a non-global RNG
> gen = torch.Generator()
> torch.manualSeed(gen, 0)
> torch.random(gen)
2357136044
> torch.random(gen)
2546248239
> torch.random()
2546248239
```

## Seed Handling

The random number generator is provided with a random seed via seed() when torch is being initialized. It can be reinitialized using seed() or manualSeed().

Initial seed can be obtained using initialSeed().

Setting a particular seed allows the user to (re)-generate a particular sequence of random numbers. Example:

```
> torch.manualSeed(123)
> = torch.uniform()
0.69646918727085
> return torch.uniform()
0.71295532141812
> return torch.uniform()
0.28613933874294
> torch.manualSeed(123)
> return torch.uniform()
0.69646918727085
> return torch.uniform()
0.71295532141812
> return torch.uniform()
0.28613933874294
> torch.manualSeed(torch.initialSeed())
> return torch.uniform()
0.69646918727085
> return torch.uniform()
0.71295532141812
> return torch.uniform()
0.28613933874294
```

To regenerate a sequence of random numbers starting from a specific point in the sequence, one can save the state of the random number generator using getRNGState() and then reset the random number generator to that state using setRNGState(). Example:

```
> torch.manualSeed(123)
> = torch.uniform()
0.69646918727085
> s = torch.getRNGState()
> return torch.uniform()
0.71295532141812
> return torch.uniform()
0.28613933874294
> torch.setRNGState(s)
> return torch.uniform()
0.71295532141812
> return torch.uniform()
0.28613933874294
```

### [Generator] Generator()

Creates a non-global random generator that carries its own state and can be passed as the first argument to any function that generates a random number.

### [number] seed([gen,])

Set the seed of the random number generator using `/dev/urandom`

(on Windows the time of the computer with granularity of seconds is used).
Returns the seed obtained.

### manualSeed([gen,] number)

Set the seed of the random number generator to the given `number`

.

### initialSeed([gen])

Returns the initial seed used to initialize the random generator.

### [Tensor] getRNGState([gen])

Returns the current state of the random number generator as a torch.ByteTensor. This can then be used to set the state of the RNG so that the same sequence of random numbers is produced.

### [Tensor] setRNGState([gen,] state)

Sets the state of the random number generator. If `state`

was obtained earlier
using `getRNGState`

then the random number generator should now generate the
same numbers as it did from the point where `state`

was obtained. This function
returns its argument `state`

.

### [number] random([gen,] [a], [b])

Returns an unsigned 32 bit integer random number from `[a,b]`

. By default `a`

is `1`

and `b`

is `2^32`

.

### [number] uniform([gen,] [a],[b])

Returns a random real number according to uniform distribution on `[a,b)`

. By default `a`

is `0`

and `b`

is `1`

.

### [number] normal([gen,] [mean],[stdv])

Returns a random real number according to a normal distribution with the given `mean`

and standard deviation `stdv`

.
`stdv`

must be positive.

### [number] exponential([gen,] lambda)

Returns a random real number according to the exponential distribution
`p(x) = lambda * exp(-lambda * x)`

### [number] cauchy([gen,] median, sigma)

Returns a random real number according to the Cauchy distribution
`p(x) = sigma/(pi*(sigma^2 + (x-median)^2))`

### [number] logNormal([gen,] mean, stdv)

Returns a random real number according to the log-normal distribution, with
the given `mean`

and standard deviation `stdv`

.
`mean`

and `stdv`

are the corresponding mean and standard deviation of the underlying normal distribution,
and not of the returned distribution.

`stdv`

must be positive.

### [number] geometric([gen,] p)

Returns a random integer number according to a geometric distribution
`p(i) = (1-p) * p^(i-1)`

. `p`

must satisfy `0 < p < 1`

.

### [number] bernoulli([gen,] [p])

Returns `1`

with probability `p`

and `0`

with probability `1-p`

. `p`

must satisfy `0 <= p <= 1`

.
By default `p`

is equal to `0.5`

.