C++ utility library for linear algebra, etc.

RandomSequence.h

Committer:
gltest26
Date:
2012-07-23
Revision:
0:189617a75df4

File content as of revision 0:189617a75df4:

#ifndef CPPLIB_RANDOMSEQUENCE_H
#define CPPLIB_RANDOMSEQUENCE_H
/* rseq.h
 * 
 * pseudo-random number sequence generator object, ported from clib,
 * which generates exactly the same sequence by the same seed number.
 *
 */
#include <limits.h>
#include <clib/rseq.h>

struct RandomSequence : random_sequence{
    RandomSequence(unsigned long seed1 = 5242314, unsigned long seed2 = 6363893);
    RandomSequence(const void *pointer){init((unsigned long)pointer, 6363893);}
    unsigned long next();
    double nextd(){return ((double)next() / ULONG_MAX);}
    double nextGauss(){return (nextd() - .5) + (nextd() - .5);}
    void init(unsigned long seed1, unsigned long seed2);
};


/* --- Implementations --- */

inline RandomSequence::RandomSequence(unsigned long seed1, unsigned long seed2){
    init(seed1, seed2);
}

inline void RandomSequence::init(unsigned long seed1, unsigned long seed2){
    w = ((z = (seed1)) ^ 123459876L) * 123459871L;
    z += ((w += (seed2)) ^ 1534241562L) * 123459876L;
}

inline unsigned long RandomSequence::next(){
    return (((z=36969*(z&65535)+(z>>16))<<16)+(w=18000*(w&65535)+(w>>16)));
}

#endif /* CPPLIB_RANDOMSEQUENCE_H */