SST  9.0.0
StructuralSimulationToolkit
mersenne.h
1 // Copyright 2009-2019 NTESS. Under the terms
2 // of Contract DE-NA0003525 with NTESS, the U.S.
3 // Government retains certain rights in this software.
4 //
5 // Copyright (c) 2009-2019, NTESS
6 // All rights reserved.
7 //
8 // This file is part of the SST software package. For license
9 // information, see the LICENSE file in the top level directory of the
10 // distribution.
11 
12 #ifndef SST_CORE_RNG_MERSENNE_H
13 #define SST_CORE_RNG_MERSENNE_H
14 
15 #include <stdint.h>
16 #include <sys/time.h>
17 
18 #include "sstrng.h"
19 
20 #define MERSENNE_UINT32_MAX 4294967295U
21 #define MERSENNE_UINT64_MAX 18446744073709551615ULL
22 #define MERSENNE_INT32_MAX 2147483647L
23 #define MERSENNE_INT64_MAX 9223372036854775807LL
24 
25 namespace SST {
26 namespace RNG {
27 /**
28  \class MersenneRNG mersenne.h "sst/core/rng/mersenne.h"
29 
30  Implements a Mersenne-based RNG for use in the SST core or components. The Mersenne
31  RNG provides a better "randomness" to the distribution of outputs but is computationally
32  more expensive than the Marsaglia RNG.
33 */
34 class MersenneRNG : public SSTRandom {
35 
36  public:
37  /**
38  Create a new Mersenne RNG with a specified seed
39  @param[in] seed The seed for this RNG
40  */
41  MersenneRNG(unsigned int seed);
42 
43  /**
44  Creates a new Mersenne using a random seed which is obtained from the system
45  clock. Note this will give different results on different platforms and between
46  runs.
47  */
48  MersenneRNG();
49 
50  /**
51  Generates the next random number as a double value between 0 and 1.
52  */
53  double nextUniform() override;
54 
55  /**
56  Generates the next random number as an unsigned 32-bit integer
57  */
58  uint32_t generateNextUInt32() override;
59 
60  /**
61  Generates the next random number as an unsigned 64-bit integer
62  */
63  uint64_t generateNextUInt64() override;
64 
65  /**
66  Generates the next random number as a signed 64-bit integer
67  */
68  int64_t generateNextInt64() override;
69 
70  /**
71  Generates the next random number as a signed 32-bit integer
72  */
73  int32_t generateNextInt32() override;
74 
75  /**
76  Seed the XOR RNG
77  */
78  void seed(uint64_t newSeed);
79 
80  /**
81  Destructor for Mersenne
82  */
83  ~MersenneRNG();
84 
85  private:
86  /**
87  Generates the next batch of random numbers
88  */
89  void generateNextBatch();
90 
91  /**
92  Stores the next set of random numbers
93  */
94  uint32_t* numbers;
95 
96  /**
97  Tells us what index of the random number list the next returnable number should come from
98  */
99  int index;
100 
101 };
102 
103 } //namespace RNG
104 } //namespace SST
105 
106 #endif //SST_CORE_RNG_MERSENNE_H
Implements a Mersenne-based RNG for use in the SST core or components.
Definition: mersenne.h:34
double nextUniform() override
Generates the next random number as a double value between 0 and 1.
Definition: mersenne.cc:65
int32_t generateNextInt32() override
Generates the next random number as a signed 32-bit integer.
Definition: mersenne.cc:113
uint64_t generateNextUInt64() override
Generates the next random number as an unsigned 64-bit integer.
Definition: mersenne.cc:84
void seed(uint64_t newSeed)
Seed the XOR RNG.
Definition: mersenne.cc:122
MersenneRNG()
Creates a new Mersenne using a random seed which is obtained from the system clock.
Definition: mersenne.cc:25
Implements the base class for random number generators for the SST core.
Definition: sstrng.h:27
uint32_t generateNextUInt32() override
Generates the next random number as an unsigned 32-bit integer.
Definition: mersenne.cc:70
int64_t generateNextInt64() override
Generates the next random number as a signed 64-bit integer.
Definition: mersenne.cc:93
~MersenneRNG()
Destructor for Mersenne.
Definition: mersenne.cc:133