random.cc (4395:9acb011a6c35) | random.cc (5190:fc46e0d647b6) |
---|---|
1/* 2 * Copyright (c) 2003-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 15 unchanged lines hidden (view full) --- 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * Authors: Nathan Binkert 29 * Ali Saidi 30 */ 31 | 1/* 2 * Copyright (c) 2003-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 15 unchanged lines hidden (view full) --- 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * Authors: Nathan Binkert 29 * Ali Saidi 30 */ 31 |
32#ifdef __SUNPRO_CC 33#include <stdlib.h> 34#include <math.h> 35#endif 36 37#include <cstdlib> 38#include <cmath> 39 | |
40#include "base/fenv.hh" | 32#include "base/fenv.hh" |
33#include "base/intmath.hh" 34#include "base/misc.hh" |
|
41#include "base/random.hh" | 35#include "base/random.hh" |
36#include "sim/serialize.hh" |
|
42 43using namespace std; 44 | 37 38using namespace std; 39 |
45uint32_t 46getInt32() | 40Random::Random() |
47{ | 41{ |
48 return mrand48() & 0xffffffff; | 42 // default random seed taken from original source 43 init(5489); |
49} 50 | 44} 45 |
51double 52getDouble() | 46Random::Random(uint32_t s) |
53{ | 47{ |
54 return drand48(); | 48 init(s); |
55} 56 | 49} 50 |
57double 58m5round(double r) | 51Random::Random(uint32_t init_key[], int key_length) |
59{ | 52{ |
60#if defined(__sun) 61 double val; 62 int oldrnd = m5_fegetround(); 63 m5_fesetround(M5_FE_TONEAREST); 64 val = rint(r); 65 m5_fesetround(oldrnd); 66 return val; 67#else 68 return round(r); 69#endif | 53 init(init_key, key_length); |
70} 71 | 54} 55 |
72int64_t 73getUniform(int64_t min, int64_t max) | 56Random::~Random() |
74{ | 57{ |
75 double r; 76 r = drand48() * (max-min) + min; | 58} |
77 | 59 |
78 return (int64_t)m5round(r); | 60// To preserve the uniform random distribution between min and max, 61// and allow all numbers to be represented, we generate a uniform 62// random number to the nearest power of two greater than max. If 63// this number doesn't fall between 0 and max, we try again. Anything 64// else would skew the distribution. 65uint32_t 66Random::genrand(uint32_t max) 67{ 68 int log = ceilLog2(max); 69 int shift = (sizeof(uint32_t) * 8 - log); 70 uint32_t random; 71 72 do { 73 random = genrand() >> shift; 74 } while (random > max); 75 76 return random; |
79} 80 81uint64_t | 77} 78 79uint64_t |
82getUniformPos(uint64_t min, uint64_t max) | 80Random::genrand(uint64_t max) |
83{ | 81{ |
84 double r; 85 r = drand48() * (max-min) + min; | 82 int log = ceilLog2(max); 83 int shift = (sizeof(uint64_t) * 8 - log); 84 uint64_t random; |
86 | 85 |
87 return (uint64_t)m5round(r); | 86 do { 87 random = (uint64_t)genrand() << 32 | (uint64_t)genrand(); 88 random = random >> shift; 89 } while (random > max); 90 91 return random; |
88} | 92} |
93 94void 95Random::serialize(const string &base, ostream &os) 96{ 97 int length = N; 98 paramOut(os, base + ".mti", mti); 99 paramOut(os, base + ".length", length); 100 arrayParamOut(os, base + ".data", mt, length); 101} 102 103void 104Random::unserialize(const string &base, Checkpoint *cp, const string §ion) 105{ 106 int length; 107 108 paramIn(cp, section, base + ".mti", mti); 109 paramIn(cp, section, base + ".length", length); 110 if (length != N) 111 panic("cant unserialize random number data. length != %d\n", length); 112 113 arrayParamIn(cp, section, base + ".data", mt, length); 114} 115 116Random random_mt; |
|