• 奥妙重重的随机发生器


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

    好像是在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;
        }
    }
  • 相关阅读:
    修改表的定义
    DataFrame.groupby()函数
    有限差分法
    Python之pandas库
    类:实验2家中的电视
    函数:使用函数指针操作函数
    函数:函数操作结构体通过按值传递以及按址传递,使用动态内存
    函数:使用数组名作为函数参数进行操作
    函数:使用递归实现阶乘
    函数:通过按值传递及传递结构地址操作结构
  • 原文地址:https://www.cnblogs.com/ihopenot/p/6640208.html
Copyright © 2020-2023  润新知