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;
        }
    }
  • 相关阅读:
    选择适合自己的Markdown编辑器
    学习笔记
    读书笔记:Ajax/REST架构对于侵入式Web应用的优势
    scala学习之路(三)数组
    scala学习之路(二)控制结构和函数
    scala学习之路(一)基础
    Centos7下搭建Django+uWSGI+nginx基于python3
    java Date 和 数据库Date,DateTimed
    Java IO编程
    Hive内部表,外部表,分区表的创建
  • 原文地址:https://www.cnblogs.com/ihopenot/p/6640208.html
Copyright © 2011-2022 走看看