Random Numbers ============== Global random number generator ------------------------------ The Shark machine learning library provides many functions for drawing random numbers. We start with the following header files: :: #include #include using namespace shark; using namespace std; It provides access to a global random number generator and convenience functions to draw from the following distributions: - Bernoulli with name ``coinToss`` - DiscreteUniform with name `discrete`` - Uniform with name ``uni`` - Normal with name ``gauss`` - Cauchy with name ``cauchy`` - Geometric with name ``geom`` - DiffGeometric with name ``diffGeom`` - Poisson with name ``poisson`` - Gamma with name ``gam``` - Dirichlet with name ``dir`` Examples: :: bool rn1 = random::coinToss( ); long rn2 = random::discrete( ); double rn3 = random::uni( ); double rn4 = random::gauss( ); double rn5 = random::cauchy( ); long rn6 = random::geom( ); long rn7 = random::diffGeom( ); You can set the seed of the global random number generator by: :: random::seed( 1234 ); Examples of distributions ------------------------- Some examples of distributions: :: Weibull<> dist1( shark::random::globalrandom ); Bernoulli<> dist2( shark::random::globalrandom ); Binomial<> dist3( shark::random::globalrandom ); Cauchy<> dist4( shark::random::globalrandom ); DiffGeometric<> dist5( shark::random::globalrandom ); Dirichlet<> dist6( shark::random::globalrandom ); DiscreteUniform<> dist7( shark::random::globalrandom ); Erlang<> dist8( shark::random::globalrandom ); Gamma<> dist9( shark::random::globalrandom ); Geometric<> dist10( shark::random::globalrandom ); HyperGeometric<> dist12( shark::random::globalrandom ); LogNormal<> dist13( shark::random::globalrandom ); NegExponential<> dist14( shark::random::globalrandom ); Normal<> dist15( shark::random::globalrandom ); Poisson<> dist16( shark::random::globalrandom ); Uniform<> dist17( shark::random::globalrandom ); This example shows how to access the mean and variance of a normal distribution with mean one and unit variance: :: Normal< random::rng_type > normal( random::globalrandom, 1., 1. ); double mean = normal.mean(); double variance = normal.variance(); cout << mean << " (" << variance << ")" << endl; Here's an example of a uniform distribution over the real numbers from 1 to 5: :: Uniform< shark::random::rng_type > uniform( shark::random::globalrandom, 1, 5 ); Multivariate normal distribution -------------------------------- The following code shows how to sample from a mean-free multivariate Gaussian distribution: :: RealMatrix Sigma(2,2); Sigma(0,0) = 1; Sigma(0,1) = 2; Sigma(1,0) = .5; Sigma(1,1) = 1; MultiVariateNormalDistribution M(Sigma); for(unsigned i=0; i<100; i++) { cout << M().first(0) << " " << M().first(1) << endl; } Here the sampling is special, because not only the realization of the random vector is returned, but also the realization of the standard normally distributed random vector from which it was generated. Therefore, the realization has to be accessed using ``first``.