奥妙重重的随机发生器

本校高一神犇写的一个随机数生成器,看起来效果很好的样子( 看不懂。。

好像是在well random这个网站上有个paper

 

代码 :

#define long long long
/*
 * created by xehoth on 01-15-2017
 * A C++ Implementation of WELL512Random Algorithm
 * https://github.com/xehoth/WELL512RandomAlgorithm
 */
 
class Random {
 
    typedef unsigned int uint;
 
private:
    uint state[16]; // 内部状态机
    uint index;     // 下标
    uint seed;      // 随机数种子
 
public:
    /**
     *@brief 默认构造函数
     *@note  调用time(0)进行初始化
     */
    Random() {
        setSeed(time(0));
    }
    /**
     *@brief 指定种子初始化随机数发生器
     *@param[in] seed a random seed
     */
    Random(uint seed) {
        setSeed(seed);
    }
 
    ~Random() {}
public:
    /**
    *@brief 获得随机数种子
    *@return seed
    */
    uint getSeed() {
        return seed;
    }
    /**
     *@brief     设置随机数种子
     *@param[in] seed 随机数种子
     */
    void setSeed(uint seed) {
        this->seed = seed;
        index = 0;
 
        const uint mask = ~0u;
        state[0] = seed & mask;
 
        for (uint i = 1; i < 16; i++) {
            state[i] = (1812433253UL * (state[i - 1] ^ (state[i - 1] >> 30)) + i) & mask;
        }
    }
    /**
     *@brief 产生无符号整数
     *@return 一个随机无符号整数
     */
    uint nextUnsignedInt() {
        uint a, b, c, d;
        a = state[index];
        c = state[(index + 13) & 15];
        b = a ^ c ^ (a << 16) ^ (c << 15);
        c = state[(index + 9) & 15];
        c ^= (c >> 11);
        a = state[index] = b ^ c;
        d = a ^ ((a << 5) & 0xDA442D24UL);
        index = (index + 15) & 15;
        a = state[index];
        state[index] = a ^ b ^ d ^ (a << 2) ^ (b << 18) ^ (c << 28);
        return state[index];
    }
    /**
     *@brief     产生[0, max]之间的无符号整数
     *@param[in] max 最大数
     *@return random uint
     */
    uint nextUnsignedInt(uint max) {
        return nextUnsignedInt() % max + 1;
    }
    /**
     *@brief     产生[min, max]之间的无符号整数
     *@param[in] min 最小数
     *@param[in] max 最大数
     *@return random uint
     */
    uint nextUnsignedInt(uint min, uint max) {
        return nextUnsignedInt() % (max - min + 1) + min;
    }
    /**
     *@brief 产生整数
     *@return 一个随机整数
     */
    int nextInt() {
        return (nextUnsignedInt() & 1) ? nextUnsignedInt() : -nextUnsignedInt();
    }
    /**
     *@brief 产生[0, 1]之间的随机小数
     *@return a random float
     */
    float nextFloat() {
        return nextUnsignedInt(1000000) / 1000000.f;
    }
    /**
     *@param[in] min 下界
     *@param[in] max 上界
     *@return a random float
     */
    float nextFloat(float min, float max) {
        return nextFloat() * (max - min) + min;
    }
}

 

posted @ 2017-03-29 15:55  ihopenot  阅读(327)  评论(0编辑  收藏  举报