SST 12.1.0
Structural Simulation Toolkit
mersenne.h
1// Copyright 2009-2022 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-2022, 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
25namespace SST {
26namespace 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
37public:
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 */
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 */
85
86private:
87 /**
88 Generates the next batch of random numbers
89 */
90 void generateNextBatch();
91
92 /**
93 Stores the next set of random numbers
94 */
95 uint32_t* numbers;
96
97 /**
98 Tells us what index of the random number list the next returnable number should come from
99 */
100 int index;
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:35
double nextUniform() override
Generates the next random number as a double value between 0 and 1.
Definition: mersenne.cc:72
int32_t generateNextInt32() override
Generates the next random number as a signed 32-bit integer.
Definition: mersenne.cc:132
MersenneRNG()
Creates a new Mersenne using a random seed which is obtained from the system clock.
Definition: mersenne.cc:29
int64_t generateNextInt64() override
Generates the next random number as a signed 64-bit integer.
Definition: mersenne.cc:110
uint32_t generateNextUInt32() override
Generates the next random number as an unsigned 32-bit integer.
Definition: mersenne.cc:84
~MersenneRNG()
Destructor for Mersenne.
Definition: mersenne.cc:155
uint64_t generateNextUInt64() override
Generates the next random number as an unsigned 64-bit integer.
Definition: mersenne.cc:99
void seed(uint64_t newSeed)
Seed the XOR RNG.
Definition: mersenne.cc:143
Implements the base class for random number generators for the SST core.
Definition: rng.h:28