cgv
Loading...
Searching...
No Matches
random.h
1#pragma once
2#include <ctime>
3#include <algorithm>
4#include "functions.h"
5#include <cgv/math/vec.h>
6#include <cgv/math/fvec.h>
7#include <cgv/math/mat.h>
8#include <cgv/math/eig.h>
9#include <cgv/math/diag_mat.h>
10#include <cgv/math/perm_mat.h>
11#include <cgv/math/up_tri_mat.h>
12#include <cgv/math/low_tri_mat.h>
13#include <cgv/math/quaternion.h>
14#include <cmath>
15#include <set>
16//#include <cgv/math/constants.h>
17
18namespace cgv {
19namespace math {
20
26struct random
27{
28private:
29 unsigned long long u,v,w;
30 double storedval;
31public:
33 void set_seed(unsigned long long seed)
34 {
35 w = 1;
36 v = 4101842887655102017LL;
37 u = seed^v;
38 unsigned long long ull;
39 uniform(ull);
40 v = u; uniform(ull);
41 w = v; uniform(ull);
42 }
43
45 random() : storedval(0.0)
46 {
47 unsigned long long seed = clock();
48 set_seed(seed);
49 }
50
52 random(unsigned long long seed) : storedval(0.0)
53 {
54 set_seed(seed);
55 }
56
58 void uniform(unsigned long long& rv)
59 {
60 u = u*2862933555777941757LL + 7046029254386353087LL;
61 v ^= v >> 17; v ^= v <<31; v ^= v >> 8;
62 w = 4294957665U*(w & 0xffffffff) + (w >> 32);
63 unsigned long long x = u ^(u << 21); x ^= x >>35; x^=x << 4;
64 rv= (x+v)^w;
65 }
66
68 void uniform(unsigned int& rv)
69 {
70 unsigned long long v;
71 uniform(v);
72 rv= (unsigned int) v;
73 }
74
76 void uniform(int& rv)
77 {
78 unsigned long long v;
79 uniform(v);
80 rv = (int) v;
81 }
82
84 void uniform(long& rv)
85 {
86 unsigned long long v;
87 uniform(v);
88 rv = (long) v;
89 }
90
92 void uniform(long long& rv)
93 {
94 unsigned long long v;
95 uniform(v);
96 rv = (long long) v;
97 }
98
100 void uniform(bool& rv)
101 {
102 unsigned long long v;
103 uniform(v);
104 rv= v%2 == 0;
105 }
106
108 void uniform(const unsigned min,const unsigned max, unsigned& rv)
109 {
110 uniform(rv);
111 rv =rv%(max-min+1)+min;
112 }
113
115 void uniform(const int min,const int max, int& rv)
116 {
117 uniform(rv);
118 rv =(int)(rv%(unsigned)(max-min+1))+min;
119 }
120
121
123 void uniform(double& rv)
124 {
125 unsigned long long v;
126 uniform(v);
127 rv= 5.42101086242752217E-20 * v;
128 }
129
131 void uniform(const double min,const double max, double &rv)
132 {
133 double v;
134 uniform(v);
135 rv= (max-min)*v + min;
136 }
137
139 void uniform(float & rv)
140 {
141 double v;
142 uniform(v);
143 rv =(float) v;
144 }
145
147 void uniform(const float min,const float max, float& rv)
148 {
149 float f;
150 uniform(f);
151 rv= (max-min)*f + min;
152 }
153
156 {
157 for(unsigned i = 0; i < rv.size();i++)
158 uniform(rv(i));
159 }
160
162 void uniform(const float min,const float max, vec<float>& rv)
163 {
164 for(unsigned i = 0; i < rv.size();i++)
165 uniform(min,max,rv(i));
166
167 }
168
169
172 {
173 for(unsigned i = 0; i < rv.size();i++)
174 uniform(rv(i));
175 }
176
178 void uniform(const double min,const double max, vec<double>& rv)
179 {
180 for(unsigned i = 0; i < rv.size();i++)
181 uniform(min,max,rv(i));
182 }
183
185 template<typename T, cgv::type::uint32_type N>
187 {
188 for(unsigned i = 0; i < N; i++)
189 uniform(rv(i));
190 }
191
193 template<typename T, cgv::type::uint32_type N>
194 void uniform(const float min, const float max, cgv::math::fvec<T, N>& rv)
195 {
196 for(unsigned i = 0; i < N; i++)
197 uniform(min, max, rv(i));
198 }
199
202 {
203 for(unsigned i = 0; i < rv.nrows(); i++)
204 for(unsigned j = 0; j < rv.ncols(); j++)
205 uniform(rv(i,j));
206 }
207
209 void uniform(const float min,const float max, mat<float>& rv)
210 {
211 for(unsigned i = 0; i < rv.nrows(); i++)
212 for(unsigned j = 0; j < rv.ncols(); j++)
213 uniform(min,max,rv(i,j));
214 }
215
218 {
219 unsigned j;
220 for(unsigned i = 0; i < rv.size();i++)
221 {
222 uniform(j);
223 j=(i+j)%rv.size();
224 rv.swap(i,j);
225 }
226 }
227
230 {
231 for(unsigned i = 0; i < rv.nrows(); i++)
232 for(unsigned j = i; j < rv.ncols(); j++)
233 uniform(rv(i,j));
234 }
235
236
237
239 void uniform(const float min, const float max,up_tri_mat<float>& rv)
240 {
241 for(unsigned i = 0; i < rv.nrows(); i++)
242 for(unsigned j = i; j < rv.ncols(); j++)
243 uniform(min,max,rv(i,j));
244 }
245
248 {
249 for(unsigned i = 0; i < rv.nrows(); i++)
250 for(unsigned j = i; j < rv.ncols(); j++)
251 uniform(rv(i,j));
252 }
253
255 void uniform(const double min, const double max,up_tri_mat<double>& rv)
256 {
257 for(unsigned i = 0; i < rv.nrows(); i++)
258 for(unsigned j = i; j < rv.ncols(); j++)
259 uniform(min,max,rv(i,j));
260 }
261
264 {
265 for(unsigned i = 0; i < rv.nrows(); i++)
266 for(unsigned j = 0; j <= i; j++)
267 uniform(rv(i,j));
268 }
269
271 void uniform(const float min,const float max, low_tri_mat<float>& rv)
272 {
273 for(unsigned i = 0; i < rv.nrows(); i++)
274 for(unsigned j = 0; j <= i; j++)
275 uniform(min,max,rv(i,j));
276 }
277
280 {
281 for(unsigned j = 0; j < rv.ncols(); j++)
282 for(unsigned i = 0; i < j; i++)
283 uniform(rv(i,j));
284 }
285
287 void uniform(const double min,const double max, low_tri_mat<double>& rv)
288 {
289 for(unsigned j = 0; j < rv.ncols(); j++)
290 for(unsigned i = 0; i < j; i++)
291 uniform(min,max,rv(i,j));
292 }
293
296 {
297 for(unsigned i = 0; i < rv.nrows(); i++)
298 uniform(rv(i));
299 }
300
302 void uniform(const float min,const float max, diag_mat<float>& rv)
303 {
304 for(unsigned i = 0; i < rv.nrows(); i++)
305 uniform(min,max,rv(i));
306 }
307
310 {
311 for(unsigned i = 0; i < rv.nrows(); i++)
312 uniform(rv(i));
313 }
314
316 void uniform(const double min,const double max, diag_mat<double>& rv)
317 {
318 for(unsigned i = 0; i < rv.nrows(); i++)
319 uniform(min,max,rv(i));
320 }
321
322
325 {
326 for(unsigned i = 0; i < rv.nrows(); i++)
327 for(unsigned j = 0; j < rv.ncols(); j++)
328 uniform(rv(i,j));
329 }
330
332 void uniform(const double min,const double max, mat<double>& rv)
333 {
334 for(unsigned i = 0; i < rv.nrows(); i++)
335 for(unsigned j = 0; j < rv.ncols(); j++)
336 uniform(min,max,rv(i,j));
337 }
338
339
340
342 void normal(double& rv)
343 {
344 double v1,v2,rsq,fac;
345 if(storedval == 0.)
346 {
347 do{
348 uniform(v1);
349 uniform(v2);
350
351 v1 = 2.0 * v1-1.0;
352 v2 = 2.0 * v2-1.0;
353 rsq = v1*v1+v2*v2;
354 }while(rsq >= 1.0 || rsq == 0.0);
355 fac = sqrt(-2.0*std::log(rsq)/rsq);
356 storedval = v1*fac;
357 rv= v2*fac;
358
359 }else
360 {
361 fac = storedval;
362 storedval = 0.;
363 rv= fac;
364 }
365 }
366
368 void normal(float& rv)
369 {
370 double d;
371 normal(d);
372 rv = (float)d;
373 }
374
376 void normal(const double mu, const double sigma, double &rv)
377 {
378 double d;
379 normal(d);
380 rv =mu + sigma * d;
381 }
382
384 void normal(const float mu, const float sigma, float& rv)
385 { float f;
386 normal(f);
387 rv= mu + sigma * f;
388 }
389
392 {
393
394 for(unsigned i = 0;i < v.size(); i++)
395 normal(v(i));
396 v.normalize();
397 }
398
399
402 {
403 for(unsigned i = 0;i < v.size();i++)
404 normal(v(i));
405 v.normalize();
406 }
407
409 template<typename T>
411 T x[3];
412 uniform(x[0]);
413 uniform(x[1]);
414 uniform(x[2]);
415 T a, b, c, d, s;
416 T z, r, theta, omega;
417
418 z = x[0];
419 r = sqrt(1 - z * z);
420 theta = T(2) * T(3.14159) * x[1];
421 omega = T(3.14159) * x[2];
422
423 s = sin(omega);
424 a = cos(omega);
425 b = s * cos(theta) * r;
426 c = s * sin(theta) * r;
427 d = s * z;
428
429 q.set(b, c, d, a);
430 }
431
433 template<typename T>
435 {
438 q.put_matrix(m);
439 return;
440 }
441
443 template<typename T>
445 {
449 return;
450 }
451
454 {
455 if (p.size() == 0)
456 p.resize(3);
457 for (unsigned i=0; i<p.size(); ++i)
458 uniform(p(i));
459 }
460
462 void uniform_point_in_box(const vec<double>& minp,const vec<double>& maxp, vec<double>& p)
463 {
464 assert(minp.size() == maxp.size());
465 if (p.size() != minp.size())
466 p.resize(minp.size());
467 for (unsigned i=0; i<p.size(); ++i)
468 uniform(minp(i),maxp(i),p(i));
469 }
470
473 {
475 double r;
476 uniform(r);
477 r = std::pow(r, 1.0/p.size());
478 p *= r;
479 }
482 {
483 double u,v;
484 uniform(u);
485 uniform(v);
486 if(u+v > 1.0)
487 {
488 u=1.0-u;
489 v=1.0-v;
490 }
491 p= u*p1 + v*p2 +(1.0-u-v)*p3;
492 }
493
495 void uniform_point_on_sphere(const vec<double>& center,const double& radius,
496 vec<double>& p)
497 {
498 for(unsigned i = 0;i < p.size();i++)
499 normal(p(i));
500 p.normalize();
501 p=center+radius*p;
502 }
503
504
506 void uniform_nchoosek(unsigned n, unsigned k, vec<unsigned>& indices)
507 {
508 std::set<unsigned> s;
509 unsigned v;
510 while(s.size() < k)
511 {
512 uniform(0,n-1,v);
513 s.insert(v);
514 }
515
516 indices.resize(k);
517 unsigned i=0;
518 for(std::set<unsigned>::iterator it =s.begin(); it != s.end();it++,i++)
519 indices(i)=*it;
520
521 }
522
523};
524
525
526} // namespace math
527} // namespace cgv
528
matrix of fixed size dimensions
Definition fmat.h:23
A vector with zero based index.
Definition fvec.h:26
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:27
void normal(double &rv)
generates a normal deviate double-precision floating point value with mu = 0 and sigma = 1
Definition random.h:342
void uniform(low_tri_mat< double > &rv)
generates a pseudo random double precision lower triangular matrix with uniformly distribute componen...
Definition random.h:279
void uniform(vec< float > &rv)
generates a pseudo random single precision vector with uniformly distribute components between 0 and ...
Definition random.h:155
void uniform(mat< float > &rv)
generates a pseudo random single precision full matrix with uniformly distribute components between 0...
Definition random.h:201
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:376
void uniform(unsigned int &rv)
generates a 32bit pseudo random unsigned integer
Definition random.h:68
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:495
void uniform_quat_orientation(quaternion< T > &q)
generates a random orientation represented as a unit quaternion
Definition random.h:410
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:131
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:255
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:209
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:481
void uniform(long &rv)
generates a 32bit pseudo random signed integer
Definition random.h:84
void uniform(diag_mat< double > &rv)
generates a pseudo random double precision diagonal matrix with uniformly distribute components betwe...
Definition random.h:309
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:162
void uniform_orientation(fmat< T, 3, 3 > &m)
generates a single precision random orientation represented as a rotation matrix
Definition random.h:434
void uniform(float &rv)
generates a pseudo random single-precision floating point number uniformly distributed between 0 and ...
Definition random.h:139
void uniform_direction(vec< double > &v)
generates a double precision random direction (uniformly distributed position on the unit sphere)
Definition random.h:401
void uniform(diag_mat< float > &rv)
generates a pseudo random single precision diagonal matrix with uniformly distribute components betwe...
Definition random.h:295
void uniform_orientation(fmat< T, 4, 4 > &m)
generates a single precision random orientation represented as a homogeneous rotation matrix
Definition random.h:444
void set_seed(unsigned long long seed)
set a new seed
Definition random.h:33
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:332
void uniform_point_in_unit_ball(vec< double > &p)
creates an uniform distributed random point in unit sphere
Definition random.h:472
void uniform_direction(vec< float > &v)
generates a single precision random direction (uniformly distributed position on the unit sphere)
Definition random.h:391
void uniform(const unsigned min, const unsigned max, unsigned &rv)
generates a pseudo random integer between min and max
Definition random.h:108
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:287
void uniform(low_tri_mat< float > &rv)
generates a pseudo random single precision lower triangular matrix with uniformly distribute componen...
Definition random.h:263
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:506
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:462
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:239
void uniform(up_tri_mat< double > &rv)
generates a pseudo random double precision upper triangular matrix with uniformly distribute componen...
Definition random.h:247
void uniform(unsigned long long &rv)
generates 64bit pseudo random integer
Definition random.h:58
void normal(float &rv)
generates a normal deviate single-precision floating point value with mu = 0 and sigma = 1
Definition random.h:368
void uniform(mat< double > &rv)
generates a pseudo random double full matrix with uniformly distribute components between 0 and 1
Definition random.h:324
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:453
void uniform(vec< double > &rv)
generates a pseudo random double precision vector with uniformly distribute components between 0 and ...
Definition random.h:171
void uniform(up_tri_mat< float > &rv)
generates a pseudo random single precision upper triangular matrix with uniformly distribute componen...
Definition random.h:229
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:186
void uniform(bool &rv)
generates a pseudo random boolean
Definition random.h:100
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:271
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:194
void uniform(const int min, const int max, int &rv)
generates a pseudo random integer between min and max
Definition random.h:115
random(unsigned long long seed)
constructor initializes random generator with given seed
Definition random.h:52
void uniform(perm_mat &rv)
generates a pseudo random permutation matrix
Definition random.h:217
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:316
random()
standard constructor uses system time as random seed
Definition random.h:45
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:147
void uniform(long long &rv)
generates a 64bit pseudo random signed integer
Definition random.h:92
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:302
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:178
void uniform(int &rv)
generates a 32bit pseudo random signed integer
Definition random.h:76
void uniform(double &rv)
generates a pseudo random double-precision floating point number uniformly distributed between 0 and ...
Definition random.h:123
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:384