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 §ion);};extern Random random_mt;#endif // __BASE_RANDOM_HH__
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?