Changeset 503 for trunk/src/core
- Timestamp:
- 06/28/16 21:09:19 (9 years ago)
- Location:
- trunk/src/core
- Files:
-
- 1 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/core/random.cc
r487 r503 19 19 #define NV_MT_TWIST(u, v) ( (NV_MT_MIXBITS(u, v) >> 1) ^ ( (v) & 1UL ? mt_matrix_a : 0UL) ) 20 20 21 void random::mt_init( uint32 seed ) 21 nv::random& random::get() 22 { 23 static random default_rng; 24 return default_rng; 25 } 26 27 void random_mersenne::mt_init( uint32 seed ) 22 28 { 23 29 m_state[0] = static_cast<uint32>( seed & mt_full_mask ); … … 34 40 35 41 36 void random ::mt_update()42 void random_mersenne::mt_update() 37 43 { 38 44 uint32 *p = m_state; … … 51 57 52 58 53 uint32 random ::mt_uint32()59 uint32 random_mersenne::mt_uint32() 54 60 { 55 61 uint32 r; … … 70 76 } 71 77 72 random ::random( random::seed_type seed /*= 0 */ )78 random_mersenne::random_mersenne( random_mersenne::seed_type seed /*= 0 */ ) 73 79 : m_next( nullptr ), m_remaining( 0 ), m_seeded( 0 ) 74 80 { 75 mt_init( seed == 0 ? randomized_seed() : seed ); 76 } 77 78 random::seed_type random::set_seed( random::seed_type seed /*= 0 */ ) 79 { 80 if ( seed == 0 ) seed = randomized_seed(); 81 mt_init( seed ); 82 } 83 84 random_mersenne::seed_type random_mersenne::set_seed( random_mersenne::seed_type seed /*= 0 */ ) 85 { 81 86 mt_init( seed ); 82 87 return seed; 83 88 } 84 89 85 nv::random& random::get() 86 { 87 static random default_rng; 88 return default_rng; 89 } 90 91 random::result_type random::rand() 90 random_mersenne::result_type random_mersenne::rand() 92 91 { 93 92 return mt_uint32(); 94 93 } 95 94 96 uint32 random::urand( uint32 val ) 97 { 98 uint32 x, max = mt_full_mask - ( mt_full_mask % val ); 99 while ( ( x = rand() ) >= max ); 100 return x / ( max / val ); 101 } 102 103 random::seed_type random::randomized_seed() 95 random_base::seed_type random_base::randomized_seed() 104 96 { 105 97 // TODO: this seems off, as it might often seed the same, use general time … … 108 100 } 109 101 110 nv::vec2 nv::random ::precise_unit_vec2()102 nv::vec2 nv::random_base::precise_unit_vec2() 111 103 { 112 104 f32 angle = frand( math::pi<f32>() * 2.f ); … … 114 106 } 115 107 116 nv::vec3 nv::random ::precise_unit_vec3()108 nv::vec3 nv::random_base::precise_unit_vec3() 117 109 { 118 110 f32 cos_theta = frange( -1.0f, 1.0f ); … … 126 118 } 127 119 128 nv::vec2 nv::random ::fast_disk_point()120 nv::vec2 nv::random_base::fast_disk_point() 129 121 { 130 122 f32 r1 = frand(); … … 135 127 } 136 128 137 nv::vec2 nv::random ::precise_disk_point()129 nv::vec2 nv::random_base::precise_disk_point() 138 130 { 139 131 f32 r = sqrt( frand() ); … … 142 134 } 143 135 144 nv::vec3 nv::random ::fast_sphere_point()136 nv::vec3 nv::random_base::fast_sphere_point() 145 137 { 146 138 f32 rad = frand(); … … 156 148 } 157 149 158 nv::vec3 nv::random ::precise_sphere_point()150 nv::vec3 nv::random_base::precise_sphere_point() 159 151 { 160 152 f32 radius = pow( frand(), 1.f/3.f ); … … 169 161 } 170 162 171 nv::vec2 nv::random ::precise_ellipse_point( const vec2& radii )163 nv::vec2 nv::random_base::precise_ellipse_point( const vec2& radii ) 172 164 { 173 165 vec2 p = range( -radii, radii ); … … 184 176 } 185 177 186 nv::vec3 nv::random ::precise_ellipsoid_point( const vec3& radii )178 nv::vec3 nv::random_base::precise_ellipsoid_point( const vec3& radii ) 187 179 { 188 180 vec3 p = range( -radii, radii ); … … 199 191 } 200 192 201 nv::vec2 nv::random ::fast_hollow_disk_point( f32 iradius, f32 oradius )193 nv::vec2 nv::random_base::fast_hollow_disk_point( f32 iradius, f32 oradius ) 202 194 { 203 195 f32 idist2 = iradius * iradius; … … 207 199 } 208 200 209 nv::vec2 nv::random ::precise_hollow_disk_point( f32 iradius, f32 oradius )201 nv::vec2 nv::random_base::precise_hollow_disk_point( f32 iradius, f32 oradius ) 210 202 { 211 203 return fast_hollow_disk_point( iradius, oradius ); 212 204 } 213 205 214 nv::vec3 nv::random ::fast_hollow_sphere_point( f32 iradius, f32 oradius )206 nv::vec3 nv::random_base::fast_hollow_sphere_point( f32 iradius, f32 oradius ) 215 207 { 216 208 f32 idist3 = iradius * iradius * iradius; … … 220 212 } 221 213 222 nv::vec3 nv::random ::precise_hollow_sphere_point( f32 iradius, f32 oradius )214 nv::vec3 nv::random_base::precise_hollow_sphere_point( f32 iradius, f32 oradius ) 223 215 { 224 216 return fast_hollow_sphere_point( iradius, oradius ); … … 226 218 227 219 228 nv::vec2 nv::random ::fast_hollow_ellipse_point( const vec2& iradii, const vec2& oradii )220 nv::vec2 nv::random_base::fast_hollow_ellipse_point( const vec2& iradii, const vec2& oradii ) 229 221 { 230 222 vec2 iradii2 = iradii * iradii; … … 241 233 } 242 234 243 nv::vec2 nv::random ::precise_hollow_ellipse_point( const vec2& iradii, const vec2& oradii )235 nv::vec2 nv::random_base::precise_hollow_ellipse_point( const vec2& iradii, const vec2& oradii ) 244 236 { 245 237 return fast_hollow_ellipse_point( iradii, oradii ); 246 238 } 247 239 248 nv::vec3 nv::random ::fast_hollow_ellipsoid_point( const vec3& iradii, const vec3& oradii )240 nv::vec3 nv::random_base::fast_hollow_ellipsoid_point( const vec3& iradii, const vec3& oradii ) 249 241 { 250 242 vec3 iradii2 = iradii * iradii; … … 267 259 } 268 260 269 nv::vec3 nv::random ::precise_hollow_ellipsoid_point( const vec3& iradii, const vec3& oradii )261 nv::vec3 nv::random_base::precise_hollow_ellipsoid_point( const vec3& iradii, const vec3& oradii ) 270 262 { 271 263 return fast_hollow_ellipsoid_point( iradii, oradii ); 272 264 } 273 265 266 nv::random_xor128::random_xor128( seed_type seed /*= randomized_seed() */ ) 267 { 268 set_seed( seed ); 269 } 270 271 nv::random_base::seed_type nv::random_xor128::set_seed( seed_type seed /*= 0 */ ) 272 { 273 uint32 s = 4294967296 - seed; 274 m_state[0] = 123456789 * s; 275 m_state[1] = 362436069 * s; 276 m_state[2] = 521288629 * s; 277 m_state[3] = 88675123 * s; 278 return seed; 279 } 280 281 nv::random_base::result_type nv::random_xor128::rand() 282 { 283 uint32 t = m_state[0]; 284 t ^= t << 11; 285 t ^= t >> 8; 286 m_state[0] = m_state[1]; m_state[1] = m_state[2]; m_state[2] = m_state[3]; 287 m_state[3] ^= m_state[3] >> 19; 288 m_state[3] ^= t; 289 return m_state[3]; 290 }
Note: See TracChangeset
for help on using the changeset viewer.