C++ utility library for linear algebra, etc.
RandomSequence.h@0:189617a75df4, 2012-07-23 (annotated)
- Committer:
- gltest26
- Date:
- Mon Jul 23 00:15:20 2012 +0000
- Revision:
- 0:189617a75df4
Imported cpplib frequently used headers
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gltest26 | 0:189617a75df4 | 1 | #ifndef CPPLIB_RANDOMSEQUENCE_H |
gltest26 | 0:189617a75df4 | 2 | #define CPPLIB_RANDOMSEQUENCE_H |
gltest26 | 0:189617a75df4 | 3 | /* rseq.h |
gltest26 | 0:189617a75df4 | 4 | * |
gltest26 | 0:189617a75df4 | 5 | * pseudo-random number sequence generator object, ported from clib, |
gltest26 | 0:189617a75df4 | 6 | * which generates exactly the same sequence by the same seed number. |
gltest26 | 0:189617a75df4 | 7 | * |
gltest26 | 0:189617a75df4 | 8 | */ |
gltest26 | 0:189617a75df4 | 9 | #include <limits.h> |
gltest26 | 0:189617a75df4 | 10 | #include <clib/rseq.h> |
gltest26 | 0:189617a75df4 | 11 | |
gltest26 | 0:189617a75df4 | 12 | struct RandomSequence : random_sequence{ |
gltest26 | 0:189617a75df4 | 13 | RandomSequence(unsigned long seed1 = 5242314, unsigned long seed2 = 6363893); |
gltest26 | 0:189617a75df4 | 14 | RandomSequence(const void *pointer){init((unsigned long)pointer, 6363893);} |
gltest26 | 0:189617a75df4 | 15 | unsigned long next(); |
gltest26 | 0:189617a75df4 | 16 | double nextd(){return ((double)next() / ULONG_MAX);} |
gltest26 | 0:189617a75df4 | 17 | double nextGauss(){return (nextd() - .5) + (nextd() - .5);} |
gltest26 | 0:189617a75df4 | 18 | void init(unsigned long seed1, unsigned long seed2); |
gltest26 | 0:189617a75df4 | 19 | }; |
gltest26 | 0:189617a75df4 | 20 | |
gltest26 | 0:189617a75df4 | 21 | |
gltest26 | 0:189617a75df4 | 22 | /* --- Implementations --- */ |
gltest26 | 0:189617a75df4 | 23 | |
gltest26 | 0:189617a75df4 | 24 | inline RandomSequence::RandomSequence(unsigned long seed1, unsigned long seed2){ |
gltest26 | 0:189617a75df4 | 25 | init(seed1, seed2); |
gltest26 | 0:189617a75df4 | 26 | } |
gltest26 | 0:189617a75df4 | 27 | |
gltest26 | 0:189617a75df4 | 28 | inline void RandomSequence::init(unsigned long seed1, unsigned long seed2){ |
gltest26 | 0:189617a75df4 | 29 | w = ((z = (seed1)) ^ 123459876L) * 123459871L; |
gltest26 | 0:189617a75df4 | 30 | z += ((w += (seed2)) ^ 1534241562L) * 123459876L; |
gltest26 | 0:189617a75df4 | 31 | } |
gltest26 | 0:189617a75df4 | 32 | |
gltest26 | 0:189617a75df4 | 33 | inline unsigned long RandomSequence::next(){ |
gltest26 | 0:189617a75df4 | 34 | return (((z=36969*(z&65535)+(z>>16))<<16)+(w=18000*(w&65535)+(w>>16))); |
gltest26 | 0:189617a75df4 | 35 | } |
gltest26 | 0:189617a75df4 | 36 | |
gltest26 | 0:189617a75df4 | 37 | #endif /* CPPLIB_RANDOMSEQUENCE_H */ |