Permalink
177 lines (137 sloc) 5.36 KB

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)

Set 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.