support for user-specified parameters
This commit is contained in:
@@ -345,6 +345,40 @@ struct arma_rng::randu
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline
|
||||
static
|
||||
void
|
||||
fill(eT* mem, const uword N, const double a, const double b)
|
||||
{
|
||||
#if defined(ARMA_RNG_ALT)
|
||||
{
|
||||
const double r = b - a;
|
||||
|
||||
for(uword i=0; i < N; ++i) { mem[i] = eT( arma_rng_alt::randu_val() * r + a ); }
|
||||
}
|
||||
#elif defined(ARMA_USE_EXTERN_RNG)
|
||||
{
|
||||
std::uniform_real_distribution<double> local_u_distr(a,b);
|
||||
|
||||
for(uword i=0; i < N; ++i) { mem[i] = eT( local_u_distr(mt19937_64_instance) ); }
|
||||
}
|
||||
#else
|
||||
{
|
||||
if(N == uword(1)) { mem[0] = eT( arma_rng_cxx03::randu_val() * (b - a) + a ); return; }
|
||||
|
||||
typedef typename std::mt19937_64::result_type local_seed_type;
|
||||
|
||||
std::mt19937_64 local_engine;
|
||||
std::uniform_real_distribution<double> local_u_distr(a,b);
|
||||
|
||||
local_engine.seed( local_seed_type(std::rand()) );
|
||||
|
||||
for(uword i=0; i < N; ++i) { mem[i] = eT( local_u_distr(local_engine) ); }
|
||||
}
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -438,6 +472,68 @@ struct arma_rng::randu< std::complex<T> >
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline
|
||||
static
|
||||
void
|
||||
fill(std::complex<T>* mem, const uword N, const double a, const double b)
|
||||
{
|
||||
#if defined(ARMA_RNG_ALT)
|
||||
{
|
||||
const double r = b - a;
|
||||
|
||||
for(uword i=0; i < N; ++i)
|
||||
{
|
||||
const T tmp1 = T( arma_rng_alt::randu_val() * r + a );
|
||||
const T tmp2 = T( arma_rng_alt::randu_val() * r + a );
|
||||
|
||||
mem[i] = std::complex<T>(tmp1, tmp2);
|
||||
}
|
||||
}
|
||||
#elif defined(ARMA_USE_EXTERN_RNG)
|
||||
{
|
||||
std::uniform_real_distribution<double> local_u_distr(a,b);
|
||||
|
||||
for(uword i=0; i < N; ++i)
|
||||
{
|
||||
const T tmp1 = T( local_u_distr(mt19937_64_instance) );
|
||||
const T tmp2 = T( local_u_distr(mt19937_64_instance) );
|
||||
|
||||
mem[i] = std::complex<T>(tmp1, tmp2);
|
||||
}
|
||||
}
|
||||
#else
|
||||
{
|
||||
if(N == uword(1))
|
||||
{
|
||||
const double r = b - a;
|
||||
|
||||
const T tmp1 = T( arma_rng_cxx03::randu_val() * r + a);
|
||||
const T tmp2 = T( arma_rng_cxx03::randu_val() * r + a);
|
||||
|
||||
mem[0] = std::complex<T>(tmp1, tmp2);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
typedef typename std::mt19937_64::result_type local_seed_type;
|
||||
|
||||
std::mt19937_64 local_engine;
|
||||
std::uniform_real_distribution<double> local_u_distr(a,b);
|
||||
|
||||
local_engine.seed( local_seed_type(std::rand()) );
|
||||
|
||||
for(uword i=0; i < N; ++i)
|
||||
{
|
||||
const T tmp1 = T( local_u_distr(local_engine) );
|
||||
const T tmp2 = T( local_u_distr(local_engine) );
|
||||
|
||||
mem[0] = std::complex<T>(tmp1, tmp2);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user