zoukankan      html  css  js  c++  java
  • 奥妙重重的随机发生器

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

    好像是在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;
        }
    }
  • 相关阅读:
    [置顶] windows player,wzplayerV2 for windows
    wzplayer 近期将会支持BlackBerry和WinPhone8
    wzplayerEx for android(真正硬解接口,支持加密的 player)
    ffmpeg for ios 交叉编译 (支持i686 armv7 armv7s) 包含lame支持
    ffmpeg for ios 交叉编译 (支持i686 armv7 armv7s) 包含lame支持
    编译cegcc 0.59.1
    wzplayer 近期将会支持BlackBerry和WinPhone8
    wzplayerEx for android(真正硬解接口,支持加密的 player)
    windows player,wzplayerV2 for windows(20140416)更新
    编译cegcc 0.59.1
  • 原文地址:https://www.cnblogs.com/ihopenot/p/6640208.html
Copyright © 2011-2022 走看看