32 #include "NE10_random.h" 38 const uint32_t _A = 1103515245L;
39 const uint32_t _C = 12345L;
43 void NE10_rng_init_g (
NE10_rng_t *rng, uint32_t seed)
46 rng->_private_m_A = _A;
47 rng->_private_m_C = _C;
48 rng->_private_m_X_NM1 = seed;
55 rng->_private_m_X_NM1 = (rng->_private_m_A * rng->_private_m_X_NM1 + rng->_private_m_C);
56 return rng->_private_m_X_NM1;
59 const uint32_t NE10_rng_max_g (
NE10_rng_t *rng)
69 void NE10_rng_init (uint32_t seed)
71 NE10_rng_init_g (&__NE10_rng, seed);
74 uint32_t NE10_rng_next()
76 return NE10_rng_next_g (&__NE10_rng);
79 const uint32_t NE10_rng_max()
81 return NE10_rng_max_g (NULL);
89 NE10_rng_init_g (&seed_generator, seed);
91 NE10_rng_init_g (&float_rng->_private_m_rngs[0], NE10_rng_next_g (&seed_generator));
92 NE10_rng_init_g (&float_rng->_private_m_rngs[1], NE10_rng_next_g (&seed_generator));
93 NE10_rng_init_g (&float_rng->_private_m_rngs[2], NE10_rng_next_g (&seed_generator));
98 uint32_t frc, exp, sgn, ret;
103 frc = NE10_rng_next_g (&float_rng->_private_m_rngs[0]);
104 exp = NE10_rng_next_g (&float_rng->_private_m_rngs[1]);
105 sgn = NE10_rng_next_g (&float_rng->_private_m_rngs[2]);
108 frc = (frc >> 9) & 0x7FFFFF ;
109 exp = ( (exp >> 24) & 0x0000FF) << 23;
110 sgn = ( (sgn >> 16) & 0x000001) << 31;
113 ret = frc | exp | sgn;
116 while (IS_NAN_OR_INF (ret) || IS_SUBNORMAL (ret));
119 return * ( (
float*) &ret);
132 void NE10_float_rng_init (uint32_t seed)
134 NE10_float_rng_init_g (&__NE10_float_rng , seed);
137 float NE10_float_rng_next()
139 return NE10_float_rng_next_g (&__NE10_float_rng);
142 float NE10_float_rng_max()
144 return NE10_float_rng_max_g (NULL);
149 #define IS_TOO_SMALL(f) ((fabs(f)<1.0e-3)?1:0) 150 #define IS_TOO_BIG(f) ((fabs(f)>1.0e3)?1:0) 154 void NE10_float_rng_limit_init (uint32_t seed)
156 NE10_float_rng_init_g (&__NE10_float_rng_limit , seed);
159 float NE10_float_rng_limit_next()
165 ret = NE10_float_rng_next_g (&__NE10_float_rng_limit);
167 while (IS_TOO_SMALL (ret) || IS_TOO_BIG (ret));
172 float NE10_float_rng_limit_max()
174 return NE10_float_rng_max_g (NULL);
179 #define IS_TOO_SMALL_GT1(f) ((fabs(f)<1.0e-6)?1:0) 180 #define IS_TOO_BIG_GT1(f) ((fabs(f)>1.0e+3)?1:0) 182 void NE10_float_rng_limit_gt1_init (uint32_t seed)
184 NE10_float_rng_init_g (&__NE10_float_rng_limit , seed);
187 float NE10_float_rng_limit_gt1_next()
193 ret = NE10_float_rng_next_g (&__NE10_float_rng_limit);
195 while (IS_TOO_SMALL_GT1 (ret) || IS_TOO_BIG_GT1 (ret));
200 float NE10_float_rng_limit_gt1_max()
202 return NE10_float_rng_max_g (NULL);