// utilities.h
template < typename Generator>
double randomDoubleEngine( Generator& engine, double low_bound, double high_bound )
{
if ( low_bound > high_bound) {
std:: swap ( low_bound, high_bound) ;
}
return std:: uniform_real_distribution <> ( low_bound, high_bound ) ( engine ) ;
}
template < typename Generator = std:: mt19937 , typename Distribution = std:: uniform_real_distribution < double > , typename T = double >
struct randGen
{
randGen( const Generator & eng, T low, T high) : m_engine( eng) , m_distribution( low, high) { }
T operator( ) ( ) { return m_distribution( m_engine) ; }
private :
Generator m_engine;
Distribution m_distribution;
} ;
// myclass.cpp
void myclass:: doSomething1 ( param1, param2, ...) {
std:: random_device rd;
static std:: mt19937 engine( rd( ) ) ;
for ( i= 0 ; i < someLimit; i++ ) {
Compute interval [ treshmin, threshmax]
for ( int j= 0 ; j < numIter; j++ ) {
randThreshold = randomDoubleEngine( engine, treshmin, treshmax ) ; // <------------------
....
}
}
}
void myclass:: doSomething2 ( param1, param2, ...) {
std:: random_device rd;
static std:: mt19937 engine( rd( ) ) ;
for ( i= 0 ; i < someLimit; i++ ) {
Compute interval [ treshmin, threshmax]
randGen< std:: mt19937 , std:: uniform_real_distribution < double > , double > myRandGen( engine, treshmin, treshmax ) ;
for ( int j= 0 ; j < numIter; j++ ) {
randThreshold = myRandGen( ) ; // <------------------
....
}
}
}
void myclass:: doSomething3 ( param1, param2, ...) {
std:: random_device rd;
std:: mt19937 engine( rd( ) ) ;
for ( i= 0 ; i < someLimit; i++ ) {
Compute interval [ treshmin, threshmax]
randGen< std:: mt19937 , std:: uniform_real_distribution < double > , double > myRandGen( engine, treshmin, treshmax ) ;
for ( int j= 0 ; j < numIter; j++ ) {
randThreshold = myRandGen( ) ; // <------------------
....
}
}
}
Ly8gdXRpbGl0aWVzLmgKCXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmF0b3I+Cglkb3VibGUgcmFuZG9tRG91YmxlRW5naW5lKEdlbmVyYXRvciYgZW5naW5lLCBkb3VibGUgbG93X2JvdW5kLCBkb3VibGUgaGlnaF9ib3VuZCApCgl7CgkJaWYgKGxvd19ib3VuZCA+IGhpZ2hfYm91bmQpewoJCQlzdGQ6OnN3YXAobG93X2JvdW5kLCBoaWdoX2JvdW5kKTsKCQl9CgoJCXJldHVybiBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiggbG93X2JvdW5kLCBoaWdoX2JvdW5kICkoIGVuZ2luZSApOwoJfQoJCgl0ZW1wbGF0ZSA8IHR5cGVuYW1lIEdlbmVyYXRvciA9IHN0ZDo6bXQxOTkzNywgdHlwZW5hbWUgRGlzdHJpYnV0aW9uID0gc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4sIHR5cGVuYW1lIFQgPSBkb3VibGUgPgoJc3RydWN0IHJhbmRHZW4KCXsKCQlyYW5kR2VuKGNvbnN0IEdlbmVyYXRvciAmIGVuZywgVCBsb3csIFQgaGlnaCkgOiBtX2VuZ2luZShlbmcpLCAgbV9kaXN0cmlidXRpb24obG93LCBoaWdoKSB7fQoJCVQgb3BlcmF0b3IoKSgpIHsgcmV0dXJuIG1fZGlzdHJpYnV0aW9uKG1fZW5naW5lKTsgfQoKCSAgcHJpdmF0ZToKCgkJR2VuZXJhdG9yIG1fZW5naW5lOwoJCURpc3RyaWJ1dGlvbiBtX2Rpc3RyaWJ1dGlvbjsKCX07CgkKLy8gbXljbGFzcy5jcHAJCgl2b2lkIG15Y2xhc3M6OmRvU29tZXRoaW5nMShwYXJhbTEsIHBhcmFtMiwgLi4uKXsKCQoJCXN0ZDo6cmFuZG9tX2RldmljZSByZDsKCQlzdGF0aWMgc3RkOjptdDE5OTM3IGVuZ2luZShyZCgpKTsKCQkKCQlmb3IgKGk9MDsgaSA8IHNvbWVMaW1pdDsgaSsrKXsKCQkJQ29tcHV0ZSBpbnRlcnZhbCBbdHJlc2htaW4sIHRocmVzaG1heF0KCQkJCgkJCWZvcihpbnQgaj0wOyBqIDwgbnVtSXRlcjsgaisrKXsKCQkJCXJhbmRUaHJlc2hvbGQgPSByYW5kb21Eb3VibGVFbmdpbmUoZW5naW5lLCB0cmVzaG1pbiwgdHJlc2htYXggKTsgLy8gPC0tLS0tLS0tLS0tLS0tLS0tLQoJCQkJLi4uLgoJCQl9CgkJfQoJfQoJCgl2b2lkIG15Y2xhc3M6OmRvU29tZXRoaW5nMihwYXJhbTEsIHBhcmFtMiwgLi4uKXsKCQoJCXN0ZDo6cmFuZG9tX2RldmljZSByZDsKCQlzdGF0aWMgc3RkOjptdDE5OTM3IGVuZ2luZShyZCgpKTsKCQkKCQlmb3IgKGk9MDsgaSA8IHNvbWVMaW1pdDsgaSsrKXsKCQkJQ29tcHV0ZSBpbnRlcnZhbCBbdHJlc2htaW4sIHRocmVzaG1heF0KCQkJCgkJCXJhbmRHZW48c3RkOjptdDE5OTM3LCBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248ZG91YmxlPiwgZG91YmxlID4gbXlSYW5kR2VuKCBlbmdpbmUsIHRyZXNobWluLCAgdHJlc2htYXggKTsKCQkJCgkJCWZvcihpbnQgaj0wOyBqIDwgbnVtSXRlcjsgaisrKXsKCQkJCXJhbmRUaHJlc2hvbGQgPSBteVJhbmRHZW4oKTsgLy8gPC0tLS0tLS0tLS0tLS0tLS0tLQoJCQkJLi4uLgoJCQl9CgkJfQoJfQoJCgl2b2lkIG15Y2xhc3M6OmRvU29tZXRoaW5nMyhwYXJhbTEsIHBhcmFtMiwgLi4uKXsKCQoJCXN0ZDo6cmFuZG9tX2RldmljZSByZDsKCQlzdGQ6Om10MTk5MzcgZW5naW5lKHJkKCkpOwoJCQoJCWZvciAoaT0wOyBpIDwgc29tZUxpbWl0OyBpKyspewoJCQlDb21wdXRlIGludGVydmFsIFt0cmVzaG1pbiwgdGhyZXNobWF4XQoJCQkKCQkJcmFuZEdlbjxzdGQ6Om10MTk5MzcsIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjxkb3VibGU+LCBkb3VibGUgPiBteVJhbmRHZW4oIGVuZ2luZSwgdHJlc2htaW4sICB0cmVzaG1heCApOwoJCQkKCQkJZm9yKGludCBqPTA7IGogPCBudW1JdGVyOyBqKyspewoJCQkJcmFuZFRocmVzaG9sZCA9IG15UmFuZEdlbigpOyAvLyA8LS0tLS0tLS0tLS0tLS0tLS0tCgkJCQkuLi4uCgkJCX0KCQl9Cgl9
compilation info
prog.cpp: In function 'double randomDoubleEngine(Generator&, double, double)':
prog.cpp:6:4: error: 'swap' is not a member of 'std'
prog.cpp:9:10: error: 'uniform_real_distribution' is not a member of 'std'
prog.cpp:9:41: error: expected primary-expression before '>' token
prog.cpp: At global scope:
prog.cpp:12:34: error: expected type-specifier
prog.cpp:12:34: error: expected '>'
prog.cpp:15:34: error: 'T' has not been declared
prog.cpp:15:41: error: 'T' has not been declared
prog.cpp:16:3: error: 'T' does not name a type
prog.cpp:21:3: error: 'Distribution' does not name a type
prog.cpp: In constructor 'randGen<Generator>::randGen(const Generator&, int, int)':
prog.cpp:15:67: error: class 'randGen<Generator>' does not have any field named 'm_distribution'
prog.cpp: At global scope:
prog.cpp:25:7: error: 'myclass' has not been declared
prog.cpp:25:29: error: variable or field 'doSomething1' declared void
prog.cpp:25:29: error: 'param1' was not declared in this scope
prog.cpp:25:37: error: 'param2' was not declared in this scope
prog.cpp:25:45: error: expected primary-expression before '...' token
stdout