random.hh

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· HH 代码 · 共 243 行

HH
243
字号
/* * Copyright (c) 2003, 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. * * Authors: Nathan L. Binkert *          Ali G. Saidi */#ifndef __BASE_RANDOM_HH__#define __BASE_RANDOM_HH__#include <ios>#include <string>#include "base/range.hh"#include "sim/host.hh"class Checkpoint;class Random{  protected:    static const int N = 624;    static const int M = 397;    static const uint32_t MATRIX_A = (uint32_t)0x9908b0df;    static const uint32_t UPPER_MASK = (uint32_t)0x80000000;    static const uint32_t LOWER_MASK = (uint32_t)0x7fffffff;    uint32_t mt[N];    int mti;    uint32_t genrand();    uint32_t genrand(uint32_t max);    uint64_t genrand(uint64_t max);    void    _random(int8_t &value)    {        value = genrand() & (int8_t)-1;    }    void    _random(int16_t &value)    {        value = genrand() & (int16_t)-1;    }    void    _random(int32_t &value)    {        value = (int32_t)genrand();    }    void    _random(int64_t &value)    {        value = (int64_t)genrand() << 32 | (int64_t)genrand();    }    void    _random(uint8_t &value)    {        value = genrand() & (uint8_t)-1;    }    void    _random(uint16_t &value)    {        value = genrand() & (uint16_t)-1;    }    void    _random(uint32_t &value)    {        value = genrand();    }    void    _random(uint64_t &value)    {        value = (uint64_t)genrand() << 32 | (uint64_t)genrand();    }    // [0,1]    void    _random(float &value)    {        // ieee floats have 23 bits of mantissa        value = (genrand() >> 9) / 8388608.0;    }    // [0,1]    void    _random(double &value)    {        double number = genrand() * 2097152.0 + (genrand() >> 11);        value = number / 9007199254740992.0;    }    // Range based versions of the random number generator    int8_t    _random(int8_t min, int8_t max)    {        uint32_t diff = max - min;        return static_cast<int8_t>(min + genrand(diff));    }    int16_t    _random(int16_t min, int16_t max)    {        uint32_t diff = max - min;        return static_cast<int16_t>(min + genrand(diff));    }    int32_t    _random(int32_t min, int32_t max)    {        uint32_t diff = max - min;        return static_cast<int32_t>(min + genrand(diff));    }    int64_t    _random(int64_t min, int64_t max)    {        uint64_t diff = max - min;        return static_cast<int64_t>(min + genrand(diff));    }    uint8_t    _random(uint8_t min, uint8_t max)    {        uint32_t diff = max - min;        return static_cast<uint8_t>(min + genrand(diff));    }    uint16_t    _random(uint16_t min, uint16_t max)    {        uint32_t diff = max - min;        return static_cast<uint16_t>(min + genrand(diff));    }    uint32_t    _random(uint32_t min, uint32_t max)    {        uint32_t diff = max - min;        return static_cast<uint32_t>(min + genrand(diff));    }    uint64_t    _random(uint64_t min, uint64_t max)    {        uint64_t diff = max - min;        return static_cast<uint64_t>(min + genrand(diff));    }  public:    Random();    Random(uint32_t s);    Random(uint32_t init_key[], int key_length);    ~Random();    void init(uint32_t s);    void init(uint32_t init_key[], int key_length);    template <typename T>    T    random()    {        T value;        _random(value);        return value;    }    template <typename T>    T    random(T min, T max)    {        return _random(min, max);    }    template <typename T>    T    random(const Range<T> &range)    {        return _random(range.start, range.end);    }    // [0,1]    double    gen_real1()    {        return genrand() / 4294967296.0;    }    // [0,1)    double    gen_real2()    {        return genrand() / 4294967295.0;    }    // (0,1)    double    gen_real3()    {        return ((double)genrand() + 0.5) / 4294967296.0;    }  public:    void serialize(const std::string &base, std::ostream &os);    void unserialize(const std::string &base, Checkpoint *cp,                     const std::string &section);};extern Random random_mt;#endif // __BASE_RANDOM_HH__

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?