Class: Numo::Random::Generator

Inherits:
Object
  • Object
show all
Defined in:
lib/numo/random/generator.rb

Overview

Generator is a class that generates random number with several distributions.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new(seed: 496)
x = rng.uniform(shape: [2, 5], low: -1, high: 2)

p x
# Numo::DFloat#shape=[2,5]
# [[1.90546, -0.543299, 0.673332, 0.759583, -0.40945],
#  [0.334635, -0.0558342, 1.28115, 1.93644, -0.0689543]]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(seed: nil, algorithm: 'pcg64') ⇒ Generator

Creates a new random number generator.

Parameters:

  • seed (Integer) (defaults to: nil)

    random seed used to initialize the random number generator.

  • algorithm (String) (defaults to: 'pcg64')

    random number generation algorithm.



28
29
30
31
# File 'lib/numo/random/generator.rb', line 28

def initialize(seed: nil, algorithm: 'pcg64') # rubocop:disable Lint/UnusedMethodArgument
  @algorithm = 'pcg64'
  @rng = PCG64.new(seed: seed)
end

Instance Attribute Details

#algorithmString

Returns random number generation algorithm.

Returns:

  • (String)


22
23
24
# File 'lib/numo/random/generator.rb', line 22

def algorithm
  @algorithm
end

Instance Method Details

#bernoulli(shape:, p:, dtype: :int32) ⇒ Numo::IntX | Numo::UIntX

Generates array consists of random values according to the Bernoulli distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new(seed: 42)
x = rng.bernoulli(shape: 1000, p: 0.4)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • p (Float)

    probability of success.

  • dtype (Symbol) (defaults to: :int32)

    data type of random array.

Returns:

  • (Numo::IntX | Numo::UIntX)


72
73
74
# File 'lib/numo/random/generator.rb', line 72

def bernoulli(shape:, p:, dtype: :int32)
  binomial(shape: shape, n: 1, p: p, dtype: dtype)
end

#binomial(shape:, n:, p:, dtype: :int32) ⇒ Numo::IntX | Numo::UIntX

Generates array consists of random values according to a binomial distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new(seed: 42)
x = rng.binomial(shape: 1000, n: 10, p: 0.4)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • n (Integer)

    number of trials.

  • p (Float)

    probability of success.

  • dtype (Symbol) (defaults to: :int32)

    data type of random array.

Returns:

  • (Numo::IntX | Numo::UIntX)


89
90
91
92
93
# File 'lib/numo/random/generator.rb', line 89

def binomial(shape:, n:, p:, dtype: :int32)
  x = klass(dtype).new(shape)
  rng.binomial(x, n: n, p: p)
  x
end

#cauchy(shape:, loc: 0.0, scale: 1.0, dtype: :float64) ⇒ Numo::DFloat | Numo::SFloat

Generates array consists of random values according to the Cauchy (Lorentz) distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new
x = rng.cauchy(shape: 100, loc: 0.0, scale: 1.0)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • loc (Float) (defaults to: 0.0)

    location parameter.

  • scale (Float) (defaults to: 1.0)

    scale parameter.

  • dtype (Symbol) (defaults to: :float64)

    data type of random array.

Returns:

  • (Numo::DFloat | Numo::SFloat)


283
284
285
286
287
# File 'lib/numo/random/generator.rb', line 283

def cauchy(shape:, loc: 0.0, scale: 1.0, dtype: :float64)
  x = klass(dtype).new(shape)
  rng.cauchy(x, loc: loc, scale: scale)
  x
end

#chisquare(shape:, df:, dtype: :float64) ⇒ Numo::DFloat | Numo::SFloat

Generates array consists of random values according to the Chi-squared distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new
x = rng.chisquare(shape: 100, df: 2.0)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • df (Float)

    degrees of freedom, must be > 0.

  • dtype (Symbol) (defaults to: :float64)

    data type of random array.

Returns:

  • (Numo::DFloat | Numo::SFloat)


301
302
303
304
305
# File 'lib/numo/random/generator.rb', line 301

def chisquare(shape:, df:, dtype: :float64)
  x = klass(dtype).new(shape)
  rng.chisquare(x, df: df)
  x
end

#discrete(shape:, weight:, dtype: :int32) ⇒ Numo::IntX | Numo::UIntX

Generates array consists of random integer values in the interval [0, n).

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new(seed: 42)
w = Numo::DFloat[0.1, 0.6, 0.2]
x = rng.discrete(shape: [3, 10], weight: w)

p x

# Numo::Int32#shape=[3,10]
# [[1, 1, 1, 1, 1, 1, 1, 1, 2, 1],
#  [0, 1, 0, 1, 1, 0, 1, 1, 2, 1],
#  [2, 1, 1, 1, 1, 2, 2, 1, 1, 2]]

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • weight (Numo::DFloat | Numo::SFloat)

    (shape: [n]) list of probabilities of each integer being generated.

  • dtype (Symbol) (defaults to: :int32)

    data type of random array.

Returns:

  • (Numo::IntX | Numo::UIntX)


245
246
247
248
249
# File 'lib/numo/random/generator.rb', line 245

def discrete(shape:, weight:, dtype: :int32)
  x = klass(dtype).new(shape)
  rng.discrete(x, weight: weight)
  x
end

#exponential(shape:, scale: 1.0, dtype: :float64) ⇒ Numo::DFloat | Numo::SFloat

Generates array consists of random values with an exponential distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new
x = rng.exponential(shape: 100, scale: 2)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • scale (Float) (defaults to: 1.0)

    scale parameter, lambda = 1.fdiv(scale).

  • dtype (Symbol) (defaults to: :float64)

    data type of random array.

Returns:

  • (Numo::DFloat | Numo::SFloat)


144
145
146
147
148
# File 'lib/numo/random/generator.rb', line 144

def exponential(shape:, scale: 1.0, dtype: :float64)
  x = klass(dtype).new(shape)
  rng.exponential(x, scale: scale)
  x
end

#f(shape:, dfnum:, dfden:, dtype: :float64) ⇒ Numo::DFloat | Numo::SFloat

Generates array consists of random values according to the F-distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new
x = rng.f(shape: 100, dfnum: 2.0, dfden: 4.0)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • dfnum (Float)

    degrees of freedom in numerator, must be > 0.

  • dfden (Float)

    degrees of freedom in denominator, must be > 0.

  • dtype (Symbol) (defaults to: :float64)

    data type of random array.

Returns:

  • (Numo::DFloat | Numo::SFloat)


320
321
322
323
324
# File 'lib/numo/random/generator.rb', line 320

def f(shape:, dfnum:, dfden:, dtype: :float64)
  x = klass(dtype).new(shape)
  rng.f(x, dfnum: dfnum, dfden: dfden)
  x
end

#gamma(shape:, k:, scale: 1.0, dtype: :float64) ⇒ Numo::DFloat | Numo::SFloat

Generates array consists of random values with a gamma distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new
x = rng.gamma(shape: 100, k: 9, scale: 0.5)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • k (Float)

    shape parameter.

  • scale (Float) (defaults to: 1.0)

    scale parameter.

  • dtype (Symbol) (defaults to: :float64)

    data type of random array.

Returns:

  • (Numo::DFloat | Numo::SFloat)


163
164
165
166
167
# File 'lib/numo/random/generator.rb', line 163

def gamma(shape:, k:, scale: 1.0, dtype: :float64)
  x = klass(dtype).new(shape)
  rng.gamma(x, k: k, scale: scale)
  x
end

#geometric(shape:, p:, dtype: :int32) ⇒ Numo::IntX | Numo::UIntX

Generates array consists of random values according to a geometric distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new(seed: 42)
x = rng.geometric(shape: 1000, p: 0.4)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • p (Float)

    probability of success on each trial.

  • dtype (Symbol) (defaults to: :int32)

    data type of random array.

Returns:

  • (Numo::IntX | Numo::UIntX)


126
127
128
129
130
# File 'lib/numo/random/generator.rb', line 126

def geometric(shape:, p:, dtype: :int32)
  x = klass(dtype).new(shape)
  rng.geometric(x, p: p)
  x
end

#gumbel(shape:, loc: 0.0, scale: 1.0, dtype: :float64) ⇒ Numo::DFloat | Numo::SFloat

Generates array consists of random values according to the Gumbel distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new
x = rng.gumbel(shape: 100, loc: 0.0, scale: 1.0)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • loc (Float) (defaults to: 0.0)

    location parameter.

  • scale (Float) (defaults to: 1.0)

    scale parameter.

  • dtype (Symbol) (defaults to: :float64)

    data type of random array.

Returns:

  • (Numo::DFloat | Numo::SFloat)


182
183
184
185
186
# File 'lib/numo/random/generator.rb', line 182

def gumbel(shape:, loc: 0.0, scale: 1.0, dtype: :float64)
  x = klass(dtype).new(shape)
  rng.gumbel(x, loc: loc, scale: scale)
  x
end

#lognormal(shape:, mean: 0.0, sigma: 1.0, dtype: :float64) ⇒ Numo::DFloat | Numo::SFloat

Generates array consists of random values according to a log-normal distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new
x = rng.lognormal(shape: 100, mean: 0.0, sigma: 1.0)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • mean (Float) (defaults to: 0.0)

    mean of normal distribution.

  • sigma (Float) (defaults to: 1.0)

    standard deviation of normal distribution.

  • dtype (Symbol) (defaults to: :float64)

    data type of random array.

Returns:

  • (Numo::DFloat | Numo::SFloat)


358
359
360
361
362
# File 'lib/numo/random/generator.rb', line 358

def lognormal(shape:, mean: 0.0, sigma: 1.0, dtype: :float64)
  x = klass(dtype).new(shape)
  rng.lognormal(x, mean: mean, sigma: sigma)
  x
end

#negative_binomial(shape:, n:, p:, dtype: :int32) ⇒ Numo::IntX | Numo::UIntX

Generates array consists of random values according to a negative binomial distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new(seed: 42)
x = rng.negative_binomial(shape: 1000, n: 10, p: 0.4)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • n (Integer)

    number of trials.

  • p (Float)

    probability of success.

  • dtype (Symbol) (defaults to: :int32)

    data type of random array.

Returns:

  • (Numo::IntX | Numo::UIntX)


108
109
110
111
112
# File 'lib/numo/random/generator.rb', line 108

def negative_binomial(shape:, n:, p:, dtype: :int32)
  x = klass(dtype).new(shape)
  rng.negative_binomial(x, n: n, p: p)
  x
end

#normal(shape:, loc: 0.0, scale: 1.0, dtype: :float64) ⇒ Numo::DFloat | Numo::SFloat

Generates array consists of random values according to a normal (Gaussian) distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new
x = rng.normal(shape: 100, loc: 0.0, scale: 1.0)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • loc (Float) (defaults to: 0.0)

    location parameter.

  • scale (Float) (defaults to: 1.0)

    scale parameter.

  • dtype (Symbol) (defaults to: :float64)

    data type of random array.

Returns:

  • (Numo::DFloat | Numo::SFloat)


339
340
341
342
343
# File 'lib/numo/random/generator.rb', line 339

def normal(shape:, loc: 0.0, scale: 1.0, dtype: :float64)
  x = klass(dtype).new(shape)
  rng.normal(x, loc: loc, scale: scale)
  x
end

#poisson(shape:, mean: 1.0, dtype: :int32) ⇒ Numo::IntX | Numo::UIntX

Generates array consists of random values according to the Poisson distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new(seed: 42)
x = rng.poisson(shape: 1000, mean: 4)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • mean (Float) (defaults to: 1.0)

    mean of poisson distribution.

  • dtype (Symbol) (defaults to: :int32)

    data type of random array.

Returns:

  • (Numo::IntX | Numo::UIntX)


200
201
202
203
204
# File 'lib/numo/random/generator.rb', line 200

def poisson(shape:, mean: 1.0, dtype: :int32)
  x = klass(dtype).new(shape)
  rng.poisson(x, mean: mean)
  x
end

#randomFloat

Returns random number with uniform distribution in the half-open interval [0, 1).

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new
v = rng.random

Returns:

  • (Float)


56
57
58
# File 'lib/numo/random/generator.rb', line 56

def random
  rng.random
end

#seedInteger

Returns the seed of random number generator.

Returns:

  • (Integer)


36
37
38
# File 'lib/numo/random/generator.rb', line 36

def seed
  rng.seed
end

#seed=(val) ⇒ Object

Sets the seed of random number generator.

Parameters:

  • val (Integer)

    random seed.



43
44
45
# File 'lib/numo/random/generator.rb', line 43

def seed=(val)
  rng.seed = val
end

#standard_t(shape:, df:, dtype: :float64) ⇒ Numo::DFloat | Numo::SFloat

Generates array consists of random values according to the Student’s t-distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new
x = rng.standard_t(shape: 100, df: 8.0)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • df (Float)

    degrees of freedom, must be > 0.

  • dtype (Symbol) (defaults to: :float64)

    data type of random array.

Returns:

  • (Numo::DFloat | Numo::SFloat)


376
377
378
379
380
# File 'lib/numo/random/generator.rb', line 376

def standard_t(shape:, df:, dtype: :float64)
  x = klass(dtype).new(shape)
  rng.standard_t(x, df: df)
  x
end

#uniform(shape:, low: 0.0, high: 1.0, dtype: :float64) ⇒ Numo::DFloat | Numo::SFloat

Generates array consists of uniformly distributed random values in the interval [low, high).

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new
x = rng.uniform(shape: 100, low: -1.5, high: 1.5)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • low (Float) (defaults to: 0.0)

    lower boundary.

  • high (Float) (defaults to: 1.0)

    upper boundary.

  • dtype (Symbol) (defaults to: :float64)

    data type of random array.

Returns:

  • (Numo::DFloat | Numo::SFloat)


264
265
266
267
268
# File 'lib/numo/random/generator.rb', line 264

def uniform(shape:, low: 0.0, high: 1.0, dtype: :float64)
  x = klass(dtype).new(shape)
  rng.uniform(x, low: low, high: high)
  x
end

#weibull(shape:, k:, scale: 1.0, dtype: :float64) ⇒ Numo::DFloat | Numo::SFloat

Generates array consists of random values with the Weibull distribution.

Examples:

require 'numo/random'

rng = Numo::Random::Generator.new
x = rng.weibull(shape: 100, k: 5, scale: 2)

Parameters:

  • shape (Integer | Array<Integer>)

    size of random array.

  • k (Float)

    shape parameter.

  • scale (Float) (defaults to: 1.0)

    scale parameter.

  • dtype (Symbol) (defaults to: :float64)

    data type of random array.

Returns:

  • (Numo::DFloat | Numo::SFloat)


219
220
221
222
223
# File 'lib/numo/random/generator.rb', line 219

def weibull(shape:, k:, scale: 1.0, dtype: :float64)
  x = klass(dtype).new(shape)
  rng.weibull(x, k: k, scale: scale)
  x
end