SST  14.1.0
StructuralSimulationToolkit
mersenne.h
1 // Copyright 2009-2024 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-2024, 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 "rng.h"
16 
17 #include <stdint.h>
18 #include <sys/time.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 */
35 {
36 
37 public:
38  /**
39  Create a new Mersenne RNG with a specified seed
40  @param[in] seed The seed for this RNG
41  */
42  MersenneRNG(unsigned int seed);
43 
44  /**
45  Creates a new Mersenne using a random seed which is obtained from the system
46  clock. Note this will give different results on different platforms and between
47  runs.
48  */
49  MersenneRNG();
50 
51  /**
52  Generates the next random number as a double value between 0 and 1.
53  */
54  double nextUniform() override;
55 
56  /**
57  Generates the next random number as an unsigned 32-bit integer
58  */
59  uint32_t generateNextUInt32() override;
60 
61  /**
62  Generates the next random number as an unsigned 64-bit integer
63  */
64  uint64_t generateNextUInt64() override;
65 
66  /**
67  Generates the next random number as a signed 64-bit integer
68  */
69  int64_t generateNextInt64() override;
70 
71  /**
72  Generates the next random number as a signed 32-bit integer
73  */
74  int32_t generateNextInt32() override;
75 
76  /**
77  Seed the XOR RNG
78  */
79  void seed(uint64_t newSeed);
80 
81  /**
82  Destructor for Mersenne
83  */
84  ~MersenneRNG();
85 
86  /**
87  * Serialization function for checkpoint
88  */
90 
91  /**
92  Serialization macro
93  */
94  ImplementSerializable(SST::RNG::MersenneRNG)
95 
96 private:
97  /**
98  Generates the next batch of random numbers
99  */
100  void generateNextBatch();
101 
102  /**
103  Stores the next set of random numbers
104  */
105  uint32_t* numbers;
106 
107  /**
108  Tells us what index of the random number list the next returnable number should come from
109  */
110  int index;
111 };
112 
113 } // namespace RNG
114 } // namespace SST
115 
116 #endif // SST_CORE_RNG_MERSENNE_H
Implements the base class for random number generators for the SST core.
Definition: rng.h:29
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition: serializer.h:43
Definition: action.cc:18
void serialize_order(SST::Core::Serialization::serializer &ser) override
Serialization function for checkpoint.
Definition: mersenne.cc:161
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:72
ImplementSerializable(SST::RNG::MersenneRNG) private uint32_t * numbers
Serialization macro.
Definition: mersenne.h:94
int32_t generateNextInt32() override
Generates the next random number as a signed 32-bit integer.
Definition: mersenne.cc:132
uint64_t generateNextUInt64() override
Generates the next random number as an unsigned 64-bit integer.
Definition: mersenne.cc:99
int index
Tells us what index of the random number list the next returnable number should come from...
Definition: mersenne.h:110
void seed(uint64_t newSeed)
Seed the XOR RNG.
Definition: mersenne.cc:143
MersenneRNG()
Creates a new Mersenne using a random seed which is obtained from the system clock.
Definition: mersenne.cc:29
uint32_t generateNextUInt32() override
Generates the next random number as an unsigned 32-bit integer.
Definition: mersenne.cc:84
int64_t generateNextInt64() override
Generates the next random number as a signed 64-bit integer.
Definition: mersenne.cc:110
~MersenneRNG()
Destructor for Mersenne.
Definition: mersenne.cc:155