cgv
Loading...
Searching...
No Matches
random.h
1#pragma once
2#include <algorithm>
3#include <ctime>
4#include <cmath>
5#include <set>
6
7#include "constants.h"
8#include "functions.h"
9#include "vec.h"
10#include "fvec.h"
11#include "mat.h"
12#include "eig.h"
13#include "diag_mat.h"
14#include "perm_mat.h"
15#include "up_tri_mat.h"
16#include "low_tri_mat.h"
17#include "quaternion.h"
18
19namespace cgv {
20namespace math {
21
27struct random
28{
29private:
30 unsigned long long u,v,w;
31 double storedval;
32public:
34 void set_seed(unsigned long long seed)
35 {
36 w = 1;
37 v = 4101842887655102017LL;
38 u = seed^v;
39 unsigned long long ull;
40 uniform(ull);
41 v = u; uniform(ull);
42 w = v; uniform(ull);
43 }
44
46 random() : storedval(0.0)
47 {
48 unsigned long long seed = clock();
49 set_seed(seed);
50 }
51
53 random(unsigned long long seed) : storedval(0.0)
54 {
55 set_seed(seed);
56 }
57
59 void uniform(unsigned long long& rv)
60 {
61 u = u*2862933555777941757LL + 7046029254386353087LL;
62 v ^= v >> 17; v ^= v <<31; v ^= v >> 8;
63 w = 4294957665U*(w & 0xffffffff) + (w >> 32);
64 unsigned long long x = u ^(u << 21); x ^= x >>35; x^=x << 4;
65 rv= (x+v)^w;
66 }
67
69 void uniform(unsigned int& rv)
70 {
71 unsigned long long v;
72 uniform(v);
73 rv= (unsigned int) v;
74 }
75
77 void uniform(int& rv)
78 {
79 unsigned long long v;
80 uniform(v);
81 rv = (int) v;
82 }
83
85 void uniform(long& rv)
86 {
87 unsigned long long v;
88 uniform(v);
89 rv = (long) v;
90 }
91
93 void uniform(long long& rv)
94 {
95 unsigned long long v;
96 uniform(v);
97 rv = (long long) v;
98 }
99
101 void uniform(bool& rv)
102 {
103 unsigned long long v;
104 uniform(v);
105 rv= v%2 == 0;
106 }
107
109 void uniform(const unsigned min,const unsigned max, unsigned& rv)
110 {
111 uniform(rv);
112 rv =rv%(max-min+1)+min;
113 }
114
116 void uniform(const int min,const int max, int& rv)
117 {
118 uniform(rv);
119 rv =(int)(rv%(unsigned)(max-min+1))+min;
120 }
121
122
124 void uniform(double& rv)
125 {
126 unsigned long long v;
127 uniform(v);
128 rv= 5.42101086242752217E-20 * v;
129 }
130
132 void uniform(const double min,const double max, double &rv)
133 {
134 double v;
135 uniform(v);
136 rv= (max-min)*v + min;
137 }
138
140 void uniform(float & rv)
141 {
142 double v;
143 uniform(v);
144 rv =(float) v;
145 }
146
148 void uniform(const float min,const float max, float& rv)
149 {
150 float f;
151 uniform(f);
152 rv= (max-min)*f + min;
153 }
154
157 {
158 for(unsigned i = 0; i < rv.size();i++)
159 uniform(rv(i));
160 }
161
163 void uniform(const float min,const float max, vec<float>& rv)
164 {
165 for(unsigned i = 0; i < rv.size();i++)
166 uniform(min,max,rv(i));
167
168 }
169
170
173 {
174 for(unsigned i = 0; i < rv.size();i++)
175 uniform(rv(i));
176 }
177
179 void uniform(const double min,const double max, vec<double>& rv)
180 {
181 for(unsigned i = 0; i < rv.size();i++)
182 uniform(min,max,rv(i));
183 }
184
186 template<typename T, cgv::type::uint32_type N>
188 {
189 for(unsigned i = 0; i < N; i++)
190 uniform(rv(i));
191 }
192
194 template<typename T, cgv::type::uint32_type N>
195 void uniform(const float min, const float max, cgv::math::fvec<T, N>& rv)
196 {
197 for(unsigned i = 0; i < N; i++)
198 uniform(min, max, rv(i));
199 }
200
203 {
204 for(unsigned i = 0; i < rv.nrows(); i++)
205 for(unsigned j = 0; j < rv.ncols(); j++)
206 uniform(rv(i,j));
207 }
208
210 void uniform(const float min,const float max, mat<float>& rv)
211 {
212 for(unsigned i = 0; i < rv.nrows(); i++)
213 for(unsigned j = 0; j < rv.ncols(); j++)
214 uniform(min,max,rv(i,j));
215 }
216
219 {
220 unsigned j;
221 for(unsigned i = 0; i < rv.size();i++)
222 {
223 uniform(j);
224 j=(i+j)%rv.size();
225 rv.swap(i,j);
226 }
227 }
228
231 {
232 for(unsigned i = 0; i < rv.nrows(); i++)
233 for(unsigned j = i; j < rv.ncols(); j++)
234 uniform(rv(i,j));
235 }
236
237
238
240 void uniform(const float min, const float max,up_tri_mat<float>& rv)
241 {
242 for(unsigned i = 0; i < rv.nrows(); i++)
243 for(unsigned j = i; j < rv.ncols(); j++)
244 uniform(min,max,rv(i,j));
245 }
246
249 {
250 for(unsigned i = 0; i < rv.nrows(); i++)
251 for(unsigned j = i; j < rv.ncols(); j++)
252 uniform(rv(i,j));
253 }
254
256 void uniform(const double min, const double max,up_tri_mat<double>& rv)
257 {
258 for(unsigned i = 0; i < rv.nrows(); i++)
259 for(unsigned j = i; j < rv.ncols(); j++)
260 uniform(min,max,rv(i,j));
261 }
262
265 {
266 for(unsigned i = 0; i < rv.nrows(); i++)
267 for(unsigned j = 0; j <= i; j++)
268 uniform(rv(i,j));
269 }
270
272 void uniform(const float min,const float max, low_tri_mat<float>& rv)
273 {
274 for(unsigned i = 0; i < rv.nrows(); i++)
275 for(unsigned j = 0; j <= i; j++)
276 uniform(min,max,rv(i,j));
277 }
278
281 {
282 for(unsigned j = 0; j < rv.ncols(); j++)
283 for(unsigned i = 0; i < j; i++)
284 uniform(rv(i,j));
285 }
286
288 void uniform(const double min,const double max, low_tri_mat<double>& rv)
289 {
290 for(unsigned j = 0; j < rv.ncols(); j++)
291 for(unsigned i = 0; i < j; i++)
292 uniform(min,max,rv(i,j));
293 }
294
297 {
298 for(unsigned i = 0; i < rv.nrows(); i++)
299 uniform(rv(i));
300 }
301
303 void uniform(const float min,const float max, diag_mat<float>& rv)
304 {
305 for(unsigned i = 0; i < rv.nrows(); i++)
306 uniform(min,max,rv(i));
307 }
308
311 {
312 for(unsigned i = 0; i < rv.nrows(); i++)
313 uniform(rv(i));
314 }
315
317 void uniform(const double min,const double max, diag_mat<double>& rv)
318 {
319 for(unsigned i = 0; i < rv.nrows(); i++)
320 uniform(min,max,rv(i));
321 }
322
323
326 {
327 for(unsigned i = 0; i < rv.nrows(); i++)
328 for(unsigned j = 0; j < rv.ncols(); j++)
329 uniform(rv(i,j));
330 }
331
333 void uniform(const double min,const double max, mat<double>& rv)
334 {
335 for(unsigned i = 0; i < rv.nrows(); i++)
336 for(unsigned j = 0; j < rv.ncols(); j++)
337 uniform(min,max,rv(i,j));
338 }
339
340
341
343 void normal(double& rv)
344 {
345 double v1,v2,rsq,fac;
346 if(storedval == 0.)
347 {
348 do{
349 uniform(v1);
350 uniform(v2);
351
352 v1 = 2.0 * v1-1.0;
353 v2 = 2.0 * v2-1.0;
354 rsq = v1*v1+v2*v2;
355 }while(rsq >= 1.0 || rsq == 0.0);
356 fac = sqrt(-2.0*std::log(rsq)/rsq);
357 storedval = v1*fac;
358 rv= v2*fac;
359
360 }else
361 {
362 fac = storedval;
363 storedval = 0.;
364 rv= fac;
365 }
366 }
367
369 void normal(float& rv)
370 {
371 double d;
372 normal(d);
373 rv = (float)d;
374 }
375
377 void normal(const double mu, const double sigma, double &rv)
378 {
379 double d;
380 normal(d);
381 rv =mu + sigma * d;
382 }
383
385 void normal(const float mu, const float sigma, float& rv)
386 { float f;
387 normal(f);
388 rv= mu + sigma * f;
389 }
390
393 {
394
395 for(unsigned i = 0;i < v.size(); i++)
396 normal(v(i));
397 v.normalize();
398 }
399
400
403 {
404 for(unsigned i = 0;i < v.size();i++)
405 normal(v(i));
406 v.normalize();
407 }
408
410 template<typename T>
412 T x[3];
413 uniform(x[0]);
414 uniform(x[1]);
415 uniform(x[2]);
416 T a, b, c, d, s;
417 T z, r, theta, omega;
418
419 z = x[0];
420 r = sqrt(1 - z * z);
421 theta = static_cast<T>(2.0 * cgv::math::constants::pi) * x[1];
422 omega = static_cast<T>(cgv::math::constants::pi) * x[2];
423
424 s = sin(omega);
425 a = cos(omega);
426 b = s * cos(theta) * r;
427 c = s * sin(theta) * r;
428 d = s * z;
429
430 q.set(b, c, d, a);
431 }
432
434 template<typename T>
436 {
439 q.put_matrix(m);
440 return;
441 }
442
444 template<typename T>
446 {
450 return;
451 }
452
455 {
456 if (p.size() == 0)
457 p.resize(3);
458 for (unsigned i=0; i<p.size(); ++i)
459 uniform(p(i));
460 }
461
463 void uniform_point_in_box(const vec<double>& minp,const vec<double>& maxp, vec<double>& p)
464 {
465 assert(minp.size() == maxp.size());
466 if (p.size() != minp.size())
467 p.resize(minp.size());
468 for (unsigned i=0; i<p.size(); ++i)
469 uniform(minp(i),maxp(i),p(i));
470 }
471
474 {
476 double r;
477 uniform(r);
478 r = std::pow(r, 1.0/p.size());
479 p *= r;
480 }
483 {
484 double u,v;
485 uniform(u);
486 uniform(v);
487 if(u+v > 1.0)
488 {
489 u=1.0-u;
490 v=1.0-v;
491 }
492 p= u*p1 + v*p2 +(1.0-u-v)*p3;
493 }
494
496 void uniform_point_on_sphere(const vec<double>& center,const double& radius,
497 vec<double>& p)
498 {
499 for(unsigned i = 0;i < p.size();i++)
500 normal(p(i));
501 p.normalize();
502 p=center+radius*p;
503 }
504
505
507 void uniform_nchoosek(unsigned n, unsigned k, vec<unsigned>& indices)
508 {
509 std::set<unsigned> s;
510 unsigned v;
511 while(s.size() < k)
512 {
513 uniform(0,n-1,v);
514 s.insert(v);
515 }
516
517 indices.resize(k);
518 unsigned i=0;
519 for(std::set<unsigned>::iterator it =s.begin(); it != s.end();it++,i++)
520 indices(i)=*it;
521
522 }
523
524};
525
526
527} // namespace math
528} // namespace cgv
529
matrix of fixed size dimensions
Definition fmat.h:23
A vector with zero based index.
Definition fvec.h:29
A matrix type (full column major storage) The matrix can be loaded directly into OpenGL without need ...
Definition mat.h:208
unsigned ncols() const
number of columns
Definition mat.h:546
unsigned nrows() const
number of rows
Definition mat.h:540
implements a quaternion.
Definition quaternion.h:21
void set(AxisEnum axis, coord_type angle)
set quaternion from coordinate axis and rotation angle
Definition quaternion.h:70
void put_homogeneous_matrix(hmat_type &M) const
compute equivalent homogeneous 4x4 rotation matrix
Definition quaternion.h:154
void put_matrix(mat_type &M) const
compute equivalent 3x3 rotation matrix
Definition quaternion.h:139
A column vector class.
Definition vec.h:28
void resize(unsigned dim)
resize the vector
Definition vec.h:496
unsigned size() const
number of elements
Definition vec.h:59
void normalize()
normalize the vector using the L2-Norm
Definition vec.h:588
the cgv namespace
Definition print.h:11
A diagonal matrix type which internally stores the elements on the main diagonal in a vector.
Definition diag_mat.h:16
unsigned nrows() const
number of rows
Definition diag_mat.h:63
a permutation matrix type
Definition perm_mat.h:13
unsigned size() const
number of stored elements
Definition perm_mat.h:34
High quality random number generator, which is a little bit slower than typical random number generat...
Definition random.h:28
void normal(double &rv)
generates a normal deviate double-precision floating point value with mu = 0 and sigma = 1
Definition random.h:343
void uniform(low_tri_mat< double > &rv)
generates a pseudo random double precision lower triangular matrix with uniformly distribute componen...
Definition random.h:280
void uniform(vec< float > &rv)
generates a pseudo random single precision vector with uniformly distribute components between 0 and ...
Definition random.h:156
void uniform(mat< float > &rv)
generates a pseudo random single precision full matrix with uniformly distribute components between 0...
Definition random.h:202
void normal(const double mu, const double sigma, double &rv)
generates a normal deviate double-precision floating point value with mu and sigma
Definition random.h:377
void uniform(unsigned int &rv)
generates a 32bit pseudo random unsigned integer
Definition random.h:69
void uniform_point_on_sphere(const vec< double > &center, const double &radius, vec< double > &p)
creates an uniform distributed random point on the surface of a sphere with given center and radius
Definition random.h:496
void uniform_quat_orientation(quaternion< T > &q)
generates a random orientation represented as a unit quaternion
Definition random.h:411
void uniform(const double min, const double max, double &rv)
generates a pseudo random double-precision floating point number uniformly distributed between min an...
Definition random.h:132
void uniform(const double min, const double max, up_tri_mat< double > &rv)
generates a pseudo random double precision upper triangular matrix with uniformly distribute componen...
Definition random.h:256
void uniform(const float min, const float max, mat< float > &rv)
generates a pseudo random single precision full matrix with uniformly distribute components between m...
Definition random.h:210
void uniform_point_in_triangle(const vec< double > &p1, const vec< double > &p2, const vec< double > &p3, vec< double > p)
creates an uniform distributed random point in triangle p1,p2,p3
Definition random.h:482
void uniform(long &rv)
generates a 32bit pseudo random signed integer
Definition random.h:85
void uniform(diag_mat< double > &rv)
generates a pseudo random double precision diagonal matrix with uniformly distribute components betwe...
Definition random.h:310
void uniform(const float min, const float max, vec< float > &rv)
generates a pseudo random single precision vector with uniformly distribute components between min an...
Definition random.h:163
void uniform_orientation(fmat< T, 3, 3 > &m)
generates a single precision random orientation represented as a rotation matrix
Definition random.h:435
void uniform(float &rv)
generates a pseudo random single-precision floating point number uniformly distributed between 0 and ...
Definition random.h:140
void uniform_direction(vec< double > &v)
generates a double precision random direction (uniformly distributed position on the unit sphere)
Definition random.h:402
void uniform(diag_mat< float > &rv)
generates a pseudo random single precision diagonal matrix with uniformly distribute components betwe...
Definition random.h:296
void uniform_orientation(fmat< T, 4, 4 > &m)
generates a single precision random orientation represented as a homogeneous rotation matrix
Definition random.h:445
void set_seed(unsigned long long seed)
set a new seed
Definition random.h:34
void uniform(const double min, const double max, mat< double > &rv)
generates a pseudo random double full matrix with uniformly distribute components between min and max
Definition random.h:333
void uniform_point_in_unit_ball(vec< double > &p)
creates an uniform distributed random point in unit sphere
Definition random.h:473
void uniform_direction(vec< float > &v)
generates a single precision random direction (uniformly distributed position on the unit sphere)
Definition random.h:392
void uniform(const unsigned min, const unsigned max, unsigned &rv)
generates a pseudo random integer between min and max
Definition random.h:109
void uniform(const double min, const double max, low_tri_mat< double > &rv)
generates a pseudo random double precision lower triangular matrix with uniformly distribute componen...
Definition random.h:288
void uniform(low_tri_mat< float > &rv)
generates a pseudo random single precision lower triangular matrix with uniformly distribute componen...
Definition random.h:264
void uniform_nchoosek(unsigned n, unsigned k, vec< unsigned > &indices)
creates a vector of k unique indices drawn from 0 to n-1
Definition random.h:507
void uniform_point_in_box(const vec< double > &minp, const vec< double > &maxp, vec< double > &p)
creates an uniform distributed random point in box minp..maxp
Definition random.h:463
void uniform(const float min, const float max, up_tri_mat< float > &rv)
generates a pseudo random single precision upper triangular matrix with uniformly distribute componen...
Definition random.h:240
void uniform(up_tri_mat< double > &rv)
generates a pseudo random double precision upper triangular matrix with uniformly distribute componen...
Definition random.h:248
void uniform(unsigned long long &rv)
generates 64bit pseudo random integer
Definition random.h:59
void normal(float &rv)
generates a normal deviate single-precision floating point value with mu = 0 and sigma = 1
Definition random.h:369
void uniform(mat< double > &rv)
generates a pseudo random double full matrix with uniformly distribute components between 0 and 1
Definition random.h:325
void uniform_point_in_unit_box(vec< double > &p)
creates an uniform distributed random point in unit box (0,0,...,0)..(1,1,...,1); if dim(p)=0,...
Definition random.h:454
void uniform(vec< double > &rv)
generates a pseudo random double precision vector with uniformly distribute components between 0 and ...
Definition random.h:172
void uniform(up_tri_mat< float > &rv)
generates a pseudo random single precision upper triangular matrix with uniformly distribute componen...
Definition random.h:230
void uniform(cgv::math::fvec< T, N > &rv)
generates a pseudo random single precision fixed-size vector with uniformly distribute components bet...
Definition random.h:187
void uniform(bool &rv)
generates a pseudo random boolean
Definition random.h:101
void uniform(const float min, const float max, low_tri_mat< float > &rv)
generates a pseudo random single precision lower triangular matrix with uniformly distribute componen...
Definition random.h:272
void uniform(const float min, const float max, cgv::math::fvec< T, N > &rv)
generates a pseudo random single precision fixed-size vector with uniformly distribute components bet...
Definition random.h:195
void uniform(const int min, const int max, int &rv)
generates a pseudo random integer between min and max
Definition random.h:116
random(unsigned long long seed)
constructor initializes random generator with given seed
Definition random.h:53
void uniform(perm_mat &rv)
generates a pseudo random permutation matrix
Definition random.h:218
void uniform(const double min, const double max, diag_mat< double > &rv)
generates a pseudo random double precision diagonal matrix with uniformly distribute components betwe...
Definition random.h:317
random()
standard constructor uses system time as random seed
Definition random.h:46
void uniform(const float min, const float max, float &rv)
generates a pseudo random single-precision floating point number uniformly distributed between min an...
Definition random.h:148
void uniform(long long &rv)
generates a 64bit pseudo random signed integer
Definition random.h:93
void uniform(const float min, const float max, diag_mat< float > &rv)
generates a pseudo random single precision diagonal matrix with uniformly distribute components betwe...
Definition random.h:303
void uniform(const double min, const double max, vec< double > &rv)
generates a pseudo random double precision vector with uniformly distribute components between min an...
Definition random.h:179
void uniform(int &rv)
generates a 32bit pseudo random signed integer
Definition random.h:77
void uniform(double &rv)
generates a pseudo random double-precision floating point number uniformly distributed between 0 and ...
Definition random.h:124
void normal(const float mu, const float sigma, float &rv)
generates a normal deviate single-precision floating point value with mu and sigma
Definition random.h:385