master
madrocketsci 4 weeks ago
parent b722664be4
commit 4e0a826903

Binary file not shown.

@ -14,56 +14,58 @@ namespace rand
//Simple Deterministic Psuedorandom Number Generator (32 bit version) //
////////////////////////////////////////////////////////////////////////
static const int32_t dpr32_mod = ( ((int32_t)1) << ((int32_t)30) ) - (int32_t)1;
static const int32_t dpr32_mult1 = ( (int32_t) 1201633 );
static int32_t dpr32_rseed = 0; // global random number seed for numeric array class
typedef int32_t narray_rands_t;
static const narray_rands_t dpr32_mod = ( ((narray_rands_t)1) << ((narray_rands_t)30) ) - (narray_rands_t)1;
static const narray_rands_t dpr32_mult1 = ( (narray_rands_t) 1201633 );
extern narray_rands_t dpr32_rseed; // global random number seed for numeric array class
int32_t dpr32_nextseed(int32_t seed);
double dpr32_randd(int32_t *seed);
float dpr32_randf(int32_t *seed);
double dpr32_gaussian(int32_t *seed);
float dpr32_gaussianf(int32_t *seed);
int dpr32_randint(int32_t *seed, int low, int high);
narray_rands_t dpr32_nextseed(narray_rands_t seed);
double dpr32_randd(narray_rands_t *seed);
float dpr32_randf(narray_rands_t *seed);
double dpr32_gaussian(narray_rands_t *seed);
float dpr32_gaussianf(narray_rands_t *seed);
int dpr32_randint(narray_rands_t *seed, int low, int high);
ams::vect2 dpr32_randuvect2(int32_t *seed);
ams::vect3 dpr32_randuvect3(int32_t *seed);
ams::vect4 dpr32_randuvect4(int32_t *seed);
ams::vect2 dpr32_randuvect2(narray_rands_t *seed);
ams::vect3 dpr32_randuvect3(narray_rands_t *seed);
ams::vect4 dpr32_randuvect4(narray_rands_t *seed);
ams::vect2f dpr32_randuvect2f(int32_t *seed);
ams::vect3f dpr32_randuvect3f(int32_t *seed);
ams::vect4f dpr32_randuvect4f(int32_t *seed);
ams::vect2f dpr32_randuvect2f(narray_rands_t *seed);
ams::vect3f dpr32_randuvect3f(narray_rands_t *seed);
ams::vect4f dpr32_randuvect4f(narray_rands_t *seed);
////////////////////////////////////////////
//Numeric array threaded random generators//
////////////////////////////////////////////
int32_t get_rseed();
void set_rseed(int32_t seed);
narray_rands_t get_rseed();
void set_rseed(narray_rands_t seed);
void set_rseed_withtimer();
narray<double> narray_rand(narray_size_t N,
int32_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray<float> narray_randf(narray_size_t N,
int32_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray<double> narray_randgauss(narray_size_t N,
int32_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray<float> narray_randgaussf(narray_size_t N,
int32_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray<int> narray_randint(narray_size_t N, int low, int highexcl,
int32_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray<vect2> narray_randuvect2(narray_size_t N,
int32_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray<vect3> narray_randuvect3(narray_size_t N,
int32_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray<vect4> narray_randuvect4(narray_size_t N,
int32_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray<vect2f> narray_randuvect2f(narray_size_t N,
int32_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray<vect3f> narray_randuvect3f(narray_size_t N,
int32_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray<vect4f> narray_randuvect4f(narray_size_t N,
int32_t *rseed = &(ams::narray::rand::dpr32_rseed));
narray_rands_t *rseed = &(ams::narray::rand::dpr32_rseed));
void test_random1();

@ -57,9 +57,19 @@ namespace narray
void narray_testmath2()
{
rand::narray_rands_t rs = 1943981;
rand::set_rseed_withtimer();
printf("rseed: %d\n",(int)rand::get_rseed());
printf("rseed: %d\n",(int)rand::dpr32_rseed); //< -- this is different than the line above
narray<double> unif = ams::narray::rand::narray_rand(10000);
//rand::set_rseed(25);
printf("rseed: %d\n",(int)rand::get_rseed());
narray<double> unif = ams::narray::rand::narray_rand(5,&rs);
printf("rseed: %d\n",(int)rand::get_rseed());
double mn1 = narray_mean(unif);
double std1 = narray_stdev(unif);
double mn2,std2;
@ -69,11 +79,14 @@ namespace narray
//_intl_printarr(unif); printf("\n");
unif = unif*2.0-1.0;
//unif.setall(3.5);
//_intl_printarr(unif); printf("\n");
mn2 = narray_mean(unif);
std2 = narray_stdev(unif);
printf("mn1=%1.3f std1=%1.3f\n",mn1,std1);
printf("mn2=%1.3f std2=%1.3f\n",mn2,std2);

@ -7,22 +7,27 @@ namespace narray
namespace rand
{
int32_t dpr32_nextseed(int32_t seed)
//defining global random number seed for numeric array random routines
narray_rands_t dpr32_rseed = 0;
narray_rands_t dpr32_nextseed(narray_rands_t seed)
{
int32_t sret = seed;
narray_rands_t sret = seed;
sret = ams::mod(sret*dpr32_mult1+1,dpr32_mod);
return sret;
}
double dpr32_randd(int32_t *seed)
double dpr32_randd(narray_rands_t *seed)
{
double ret;
printf("debug: seed: %d\n",(int)*seed);
*seed = ams::narray::rand::dpr32_nextseed(*seed);
printf("debug: seed: %d\n",(int)*seed);
ret = (double)*seed/(double)(dpr32_mod-1);
return ret;
}
float dpr32_randf(int32_t *seed)
float dpr32_randf(narray_rands_t *seed)
{
float ret;
*seed = ams::narray::rand::dpr32_nextseed(*seed);
@ -30,7 +35,7 @@ namespace rand
return ret;
}
double dpr32_gaussian(int32_t *seed)
double dpr32_gaussian(narray_rands_t *seed)
{
double ret = 0.0;
double u1,u2;
@ -46,7 +51,7 @@ namespace rand
}
float dpr32_gaussianf(int32_t *seed)
float dpr32_gaussianf(narray_rands_t *seed)
{
float ret = 0.0f;
float u1,u2;
@ -61,7 +66,7 @@ namespace rand
return ret;
}
vect2 dpr32_randuvect2(int32_t *seed)
vect2 dpr32_randuvect2(narray_rands_t *seed)
{
vect2 ret = vect2(0,0);
double th = ams::narray::rand::dpr32_randd(seed)*2.0*pi;
@ -69,7 +74,7 @@ namespace rand
return ret;
}
vect3 dpr32_randuvect3(int32_t *seed)
vect3 dpr32_randuvect3(narray_rands_t *seed)
{
vect3 ret;
double az,el;
@ -81,7 +86,7 @@ namespace rand
return ret;
}
vect4 dpr32_randuvect4(int32_t *seed)
vect4 dpr32_randuvect4(narray_rands_t *seed)
{
vect4 ret;
double x,y,z,w;
@ -96,7 +101,7 @@ namespace rand
return ret;
}
vect2f dpr32_randuvect2f(int32_t *seed)
vect2f dpr32_randuvect2f(narray_rands_t *seed)
{
vect2f ret = vect2f(0,0);
float th = ams::narray::rand::dpr32_randf(seed)*2.0*pi;
@ -104,7 +109,7 @@ namespace rand
return ret;
}
vect3f dpr32_randuvect3f(int32_t *seed)
vect3f dpr32_randuvect3f(narray_rands_t *seed)
{
vect3f ret;
float az,el;
@ -116,7 +121,7 @@ namespace rand
return ret;
}
vect4f dpr32_randuvect4f(int32_t *seed)
vect4f dpr32_randuvect4f(narray_rands_t *seed)
{
vect4f ret;
float x,y,z,w;
@ -131,27 +136,27 @@ namespace rand
return ret;
}
int32_t get_rseed()
narray_rands_t get_rseed()
{
return ams::narray::rand::dpr32_rseed;
}
void set_rseed(int32_t seed)
void set_rseed(narray_rands_t seed)
{
ams::narray::rand::dpr32_rseed = seed;
}
void set_rseed_withtimer()
{
int32_t t1 = (int32_t)time(NULL);
int32_t t2 = (int32_t)(::fmod((double)clock()/((double)CLOCKS_PER_SEC)*1000.0f,36000.0f));
ams::narray::rand::dpr32_rseed = (int32_t)t1 + (int32_t)t2;
narray_rands_t t1 = (narray_rands_t)time(NULL);
narray_rands_t t2 = (narray_rands_t)(::fmod((double)clock()/((double)CLOCKS_PER_SEC)*1000.0f,36000.0f));
ams::narray::rand::dpr32_rseed = (narray_rands_t)t1 + (narray_rands_t)t2;
}
template<typename T> void narray_rand_threadf1(
narray<T> *out,
narray<int32_t> *rseeds,
T (*randfunc)(int32_t *),
narray<narray_rands_t> *rseeds,
T (*randfunc)(narray_rands_t *),
int threadnum,
int nthreads
)
@ -170,15 +175,15 @@ namespace rand
template<typename T> void narray_random_threadexec1(
narray<T> *out,
narray_size_t N,
T (*randfunc)(int32_t *),
int32_t *rseed
T (*randfunc)(narray_rands_t *),
narray_rands_t *rseed
)
{
narray_size_t I;
int J;
int nthreads;
std::vector<std::thread*> threads;
narray<int32_t> rseeds;
narray<narray_rands_t> rseeds;
int res;
res = out->resize(N);
@ -204,6 +209,7 @@ namespace rand
nthreads = (nthreads>narray_max_threads) ? narray_max_threads : nthreads;
threads.resize(nthreads);
rseeds.resize(nthreads);
for(J=0;J<nthreads;J++)
{
*rseed = dpr32_nextseed(*rseed);
@ -239,7 +245,7 @@ namespace rand
}
narray<double> narray_rand(narray_size_t N,
int32_t *rseed)
narray_rands_t *rseed)
{
narray<double> ret;
@ -260,7 +266,7 @@ namespace rand
}
narray<float> narray_randf(narray_size_t N,
int32_t *rseed)
narray_rands_t *rseed)
{
narray<float> ret;
@ -281,7 +287,7 @@ namespace rand
}
narray<double> narray_randgauss(narray_size_t N,
int32_t *rseed)
narray_rands_t *rseed)
{
narray<double> ret;
@ -302,7 +308,7 @@ namespace rand
}
narray<float> narray_randgaussf(narray_size_t N,
int32_t *rseed)
narray_rands_t *rseed)
{
narray<float> ret;
@ -323,7 +329,7 @@ namespace rand
}
narray<vect2> narray_randuvect2(narray_size_t N,
int32_t *rseed)
narray_rands_t *rseed)
{
narray<vect2> ret;
@ -344,7 +350,7 @@ namespace rand
}
narray<vect3> narray_randuvect3(narray_size_t N,
int32_t *rseed)
narray_rands_t *rseed)
{
narray<vect3> ret;
@ -365,7 +371,7 @@ namespace rand
}
narray<vect4> narray_randuvect4(narray_size_t N,
int32_t *rseed)
narray_rands_t *rseed)
{
narray<vect4> ret;
@ -386,7 +392,7 @@ namespace rand
}
narray<vect2f> narray_randuvect2f(narray_size_t N,
int32_t *rseed)
narray_rands_t *rseed)
{
narray<vect2f> ret;
@ -407,7 +413,7 @@ namespace rand
}
narray<vect3f> narray_randuvect3f(narray_size_t N,
int32_t *rseed)
narray_rands_t *rseed)
{
narray<vect3f> ret;
@ -428,7 +434,7 @@ namespace rand
}
narray<vect4f> narray_randuvect4f(narray_size_t N,
int32_t *rseed)
narray_rands_t *rseed)
{
narray<vect4f> ret;
@ -449,7 +455,7 @@ namespace rand
}
int dpr32_randint(int32_t *seed, int low, int high)
int dpr32_randint(narray_rands_t *seed, int low, int high)
{
int ret = 0;
int val;
@ -465,8 +471,8 @@ namespace rand
template<typename T> void narray_rand_threadf2(
narray<T> *out,
narray<int32_t> *rseeds,
T (*randfunc)(int32_t *, T, T),
narray<narray_rands_t> *rseeds,
T (*randfunc)(narray_rands_t *, T, T),
T low,
T highexcl,
int threadnum,
@ -487,17 +493,17 @@ namespace rand
template<typename T> void narray_random_threadexec2(
narray<T> *out,
narray_size_t N,
T (*randfunc)(int32_t *, T, T),
T (*randfunc)(narray_rands_t *, T, T),
T low,
T highexcl,
int32_t *rseed
narray_rands_t *rseed
)
{
narray_size_t I;
int J;
int nthreads;
std::vector<std::thread*> threads;
narray<int32_t> rseeds;
narray<narray_rands_t> rseeds;
int res;
res = out->resize(N);
@ -559,7 +565,7 @@ namespace rand
}
narray<int> narray_randint(narray_size_t N, int low, int highexcl,
int32_t *rseed)
narray_rands_t *rseed)
{
narray<int> ret;

Loading…
Cancel
Save