157#if defined (HAVE_CONFIG_H)
172#if ! defined (USE_X86_32)
173# if defined (i386) || defined (HAVE_X86_32)
185#define MATRIX_A 0x9908b0dfUL
186#define UMASK 0x80000000UL
187#define LMASK 0x7fffffffUL
188#define MIXBITS(u,v) ( ((u) & UMASK) | ((v) & LMASK) )
189#define TWIST(u,v) ((MIXBITS(u,v) >> 1) ^ ((v)&1UL ? MATRIX_A : 0UL))
202 state[0] = s & 0xffffffffUL;
203 for (j = 1; j <
MT_N; j++)
210 state[j] &= 0xffffffffUL;
225 k = (
MT_N > key_length ?
MT_N : key_length);
230 state[i] &= 0xffffffffUL;
241 for (k =
MT_N - 1; k; k--)
245 state[i] &= 0xffffffffUL;
254 state[0] = 0x80000000UL;
261 uint32_t entropy[
MT_N];
274 entropy[n++] = clock ();
278 entropy[n++] = now.
usec ();
293 std::random_device rd;
294 std::uniform_int_distribution<uint32_t> dist;
298 entropy[n++] = dist (rd);
300 catch (
const std::exception&)
341 for (j =
MT_M; --j; p++)
358 y ^= (y << 7) & 0x9d2c5680UL;
359 y ^= (y << 15) & 0xefc60000UL;
360 return (y ^ (y >> 18));
366#define randi32 randmt
370 const uint32_t lo =
randi32 ();
371 const uint32_t hi =
randi32 () & 0x1FFFFF;
372#if defined (HAVE_X86_32)
374 uint32_t *p = (uint32_t *)&u;
379 return ((
static_cast<uint64_t
> (hi) << 32) | lo);
385 const uint32_t lo =
randi32 ();
386 const uint32_t hi =
randi32 () & 0x3FFFFF;
387#if defined (HAVE_X86_32)
389 uint32_t *p =
static_cast<uint32_t *
> (&u);
394 return ((
static_cast<uint64_t
> (hi) << 32) | lo);
405 i =
randi32 () &
static_cast<uint32_t
> (0xFFFFFF);
409 return i * (1.0f / 16777216.0f);
422 while (a == 0 && b == 0);
424 return (a*67108864.0 + b) * (1.0/9007199254740992.0);
445#define ZIGGURAT_TABLE_SIZE 256
447#define ZIGGURAT_NOR_R 3.6541528853610088
448#define ZIGGURAT_NOR_INV_R 0.27366123732975828
449#define NOR_SECTION_AREA 0.00492867323399
451#define ZIGGURAT_EXP_R 7.69711747013104972
452#define ZIGGURAT_EXP_INV_R 0.129918765548341586
453#define EXP_SECTION_AREA 0.0039496598225815571993
455#define ZIGINT uint64_t
456#define EMANTISSA 9007199254740992.0
457#define ERANDI randi53()
458#define NMANTISSA EMANTISSA
459#define NRANDI randi54()
460#define RANDU randu53()
513 fi[255] = exp (-0.5 * x1 * x1);
524 for (i = 254; i > 0; i--)
532 fi[i] = exp (-0.5 *
x *
x);
552 for (i = 254; i > 0; i--)
599# if defined (HAVE_X86_32)
605 uint32_t *p = (uint32_t *)&rabs;
611 p[1] = hi & 0x1FFFFF;
612 x = ( si ? -rabs : rabs ) *
wi[idx];
615 const uint64_t r =
NRANDI;
616 const int64_t rabs = r >> 1;
617 const int idx =
static_cast<int> (rabs & 0xFF);
618 const double x = ( (r & 1) ? -rabs : rabs) *
wi[idx];
620 if (rabs <
static_cast<int64_t
> (
ki[idx]))
638 yy = - std::log (
RANDU);
640 while ( yy+yy <= xx*xx);
643 else if ((
fi[idx-1] -
fi[idx]) *
RANDU +
fi[idx] < exp (-0.5*
x*
x))
656 const int idx =
static_cast<int> (ri & 0xFF);
657 const double x = ri *
we[idx];
669 else if ((
fe[idx-1] -
fe[idx]) *
RANDU +
fe[idx] < exp (-
x))
696#define ZIGINT uint32_t
697#define EMANTISSA 4294967296.0
698#define ERANDI randi32()
699#define NMANTISSA 2147483648.0
700#define NRANDI randi32()
701#define RANDU randu24()
716 ffi[255] = exp (-0.5 * x1 * x1);
727 for (i = 254; i > 0; i--)
735 ffi[i] = exp (-0.5 *
x *
x);
744 ffe[255] = exp (-x1);
755 for (i = 254; i > 0; i--)
795 const uint32_t rabs = r &
LMASK;
796 const int idx =
static_cast<int> (r & 0xFF);
797 const float x =
static_cast<int32_t
> (r) *
fwi[idx];
816 yy = - std::log (
RANDU);
818 while ( yy+yy <= xx*xx);
834 const int idx =
static_cast<int> (ri & 0xFF);
835 const float x = ri *
fwe[idx];
charNDArray min(char d, const charNDArray &m)
OCTAVE_TIME_T unix_time(void) const
F77_RET_T const F77_DBLE * x
static uint64_t randi53(void)
static float randu24(void)
static uint32_t state[624]
OCTAVE_API float rand_uniform< float >(void)
void get_mersenne_twister_state(uint32_t *save)
static uint32_t randmt(void)
static uint64_t randi54(void)
static void create_ziggurat_float_tables(void)
OCTAVE_API void rand_exponential(octave_idx_type n, double *p)
OCTAVE_API double rand_uniform< double >(void)
void init_mersenne_twister(const uint32_t s)
static void next_state(void)
OCTAVE_API double rand_normal< double >(void)
void create_ziggurat_tables(void)
OCTAVE_API float rand_normal< float >(void)
OCTAVE_API void rand_normal(octave_idx_type n, double *p)
void set_mersenne_twister_state(const uint32_t *save)
OCTAVE_API void rand_uniform(octave_idx_type n, float *p)
OCTAVE_API double rand_exponential< double >(void)
OCTAVE_API float rand_exponential< float >(void)
static double randu53(void)
#define ZIGGURAT_TABLE_SIZE
#define ZIGGURAT_NOR_INV_R