Changeset 372 for trunk/src/core
- Timestamp:
- 05/22/15 16:50:38 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/core/random.cc
r319 r372 7 7 #include "nv/core/random.hh" 8 8 #include "nv/core/time.hh" 9 #include <random> 9 10 10 11 using namespace nv; 11 12 12 13 random::random( random::seed_type seed /*= 0 */ ) 13 : rng( seed == 0 ? randomized_seed() : seed ) 14 { 15 14 { 15 static_assert( sizeof( std::mt19937 ) < sizeof( random::m_data ), "No room for mersenne twister!" ); 16 new (m_data)std::mt19937( seed == 0 ? randomized_seed() : seed ); 16 17 } 17 18 18 19 random::seed_type random::randomize() 19 20 { 21 std::mt19937& rng = *(( std::mt19937* )m_data); 20 22 seed_type seed = randomized_seed(); 21 23 rng.seed( seed ); … … 25 27 void random::set_seed( random::seed_type seed /*= 0 */ ) 26 28 { 29 std::mt19937& rng = *( ( std::mt19937* )m_data ); 27 30 rng.seed( seed == 0 ? randomized_seed() : seed ); 28 31 } … … 36 39 random::result_type random::rand() 37 40 { 41 std::mt19937& rng = *( ( std::mt19937* )m_data ); 38 42 return rng(); 39 43 } … … 41 45 sint32 random::srand( sint32 val ) 42 46 { 47 std::mt19937& rng = *( ( std::mt19937* )m_data ); 43 48 std::uniform_int_distribution<sint32> dist( 0, val - 1 ); 44 49 return dist( rng ); … … 47 52 uint32 random::urand( uint32 val ) 48 53 { 54 std::mt19937& rng = *( ( std::mt19937* )m_data ); 49 55 std::uniform_int_distribution<uint32> dist( 0, val - 1 ); 50 56 return dist( rng ); … … 53 59 f32 random::frand( f32 val ) 54 60 { 61 std::mt19937& rng = *( ( std::mt19937* )m_data ); 55 62 std::uniform_real_distribution<f32> dist( 0, val ); 56 63 return dist( rng ); … … 59 66 sint32 random::srange( sint32 min, sint32 max ) 60 67 { 68 std::mt19937& rng = *( ( std::mt19937* )m_data ); 61 69 std::uniform_int_distribution<sint32> dist( min, max ); 62 70 return dist( rng ); … … 65 73 uint32 random::urange( uint32 min, uint32 max ) 66 74 { 75 std::mt19937& rng = *( ( std::mt19937* )m_data ); 67 76 std::uniform_int_distribution<uint32> dist( min, max ); 68 77 return dist( rng ); … … 71 80 f32 random::frange( f32 min, f32 max ) 72 81 { 82 std::mt19937& rng = *( ( std::mt19937* )m_data ); 73 83 std::uniform_real_distribution<f32> dist( min, max ); 74 84 return dist( rng ); … … 77 87 uint32 random::dice( uint32 count, uint32 sides ) 78 88 { 89 std::mt19937& rng = *( ( std::mt19937* )m_data ); 79 90 std::uniform_int_distribution<uint32> dist( 1, sides ); 80 91 uint32 result = 0; … … 88 99 random::seed_type random::randomized_seed() 89 100 { 101 // TODO: this seems off, as it might often seed the same, use general time 102 // instead 90 103 return narrow_cast< seed_type >( get_ticks() ); 91 104 } … … 93 106 nv::vec2 nv::random::precise_unit_vec2() 94 107 { 108 std::mt19937& rng = *( ( std::mt19937* )m_data ); 95 109 std::uniform_real_distribution<f32> dist( 0, glm::pi<float>() * 2.f ); 96 110 float angle = dist( rng ); … … 100 114 nv::vec3 nv::random::precise_unit_vec3() 101 115 { 116 std::mt19937& rng = *( ( std::mt19937* )m_data ); 102 117 std::uniform_real_distribution<f32> dist11( -1.0f, 1.0f ); 103 118 std::uniform_real_distribution<f32> dist02pi( 0.0f, 2*glm::pi<float>() ); … … 114 129 nv::vec2 nv::random::fast_disk_point() 115 130 { 131 std::mt19937& rng = *( ( std::mt19937* )m_data ); 116 132 std::uniform_real_distribution<f32> dist( 0.0f, 1.0f ); 117 133 float r1 = dist( rng ); … … 124 140 nv::vec2 nv::random::precise_disk_point() 125 141 { 142 std::mt19937& rng = *( ( std::mt19937* )m_data ); 126 143 std::uniform_real_distribution<f32> unit( 0.0f, 1.0f ); 127 144 std::uniform_real_distribution<f32> angle( 0.0f, glm::pi<float>() ); … … 133 150 nv::vec3 nv::random::fast_sphere_point() 134 151 { 152 std::mt19937& rng = *( ( std::mt19937* )m_data ); 135 153 std::uniform_real_distribution<f32> dist01( 0.0f, 1.0f ); 136 154 std::uniform_real_distribution<f32> dist11( -1.0f, 1.0f ); … … 150 168 nv::vec3 nv::random::precise_sphere_point() 151 169 { 170 std::mt19937& rng = *( ( std::mt19937* )m_data ); 152 171 std::uniform_real_distribution<f32> dist01( 0.0f, 1.0f ); 153 172 std::uniform_real_distribution<f32> dist11( -1.0f, 1.0f ); … … 166 185 nv::vec2 nv::random::precise_ellipse_point( const vec2& radii ) 167 186 { 187 std::mt19937& rng = *( ( std::mt19937* )m_data ); 168 188 std::uniform_real_distribution<f32> distx( -radii.x, radii.x ); 169 189 std::uniform_real_distribution<f32> disty( -radii.y, radii.y ); … … 184 204 nv::vec3 nv::random::precise_ellipsoid_point( const vec3& radii ) 185 205 { 206 std::mt19937& rng = *( ( std::mt19937* )m_data ); 186 207 std::uniform_real_distribution<f32> distx( -radii.x, radii.x ); 187 208 std::uniform_real_distribution<f32> disty( -radii.y, radii.y ); … … 204 225 nv::vec2 nv::random::fast_hollow_disk_point( float iradius, float oradius ) 205 226 { 227 std::mt19937& rng = *( ( std::mt19937* )m_data ); 206 228 float idist2 = iradius * iradius; 207 229 float odist2 = oradius * oradius; … … 217 239 nv::vec3 nv::random::fast_hollow_sphere_point( float iradius, float oradius ) 218 240 { 241 std::mt19937& rng = *( ( std::mt19937* )m_data ); 219 242 float idist3 = iradius * iradius * iradius; 220 243 float odist3 = oradius * oradius * oradius; … … 231 254 nv::vec2 nv::random::fast_hollow_ellipse_point( const vec2& iradii, const vec2& oradii ) 232 255 { 233 vec2 iradii2 = iradii * iradii; 256 std::mt19937& rng = *( ( std::mt19937* )m_data ); 257 vec2 iradii2 = iradii * iradii; 234 258 vec2 opoint = ellipse_edge( oradii ); 235 259 vec2 opoint2 = opoint * opoint; … … 251 275 nv::vec3 nv::random::fast_hollow_ellipsoid_point( const vec3& iradii, const vec3& oradii ) 252 276 { 253 vec3 iradii2 = iradii * iradii; 277 std::mt19937& rng = *( ( std::mt19937* )m_data ); 278 vec3 iradii2 = iradii * iradii; 254 279 vec3 opoint = ellipsoid_edge( oradii ); 255 280 vec3 opoint2 = opoint * opoint;
Note: See TracChangeset
for help on using the changeset viewer.