C++ utility library for linear algebra, etc.

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?

UserRevisionLine numberNew 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 */