SST 12.1.0 Structural Simulation Toolkit
xorshift.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//
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_XORSHIFT_H
13#define SST_CORE_RNG_XORSHIFT_H
14
15#include "rng.h"
16
17#include <stdint.h>
18#include <sys/time.h>
19
20#define XORSHIFT_UINT32_MAX 4294967295U
21#define XORSHIFT_UINT64_MAX 18446744073709551615ULL
22#define XORSHIFT_INT32_MAX 2147483647L
23#define XORSHIFT_INT64_MAX 9223372036854775807LL
24
25namespace SST {
26namespace RNG {
27/**
28 \class XORShiftRNG xorshift.h "sst/core/rng/xorshift.h"
29
30 Implements a lightweight RNG based on XOR-shift operations. We utilize the
31 XORSHIFT algorithm from: http://en.wikipedia.org/wiki/Xorshift. This is a very
32 lightweight and inexpensive RNG.
33
34*/
36{
37
38public:
39 /**
40 Create a new Mersenne RNG with a specified seed
41 @param[in] seed The seed for this RNG
42 */
43 XORShiftRNG(unsigned int seed);
44
45 /**
46 Creates a new Mersenne using a random seed which is obtained from the system
47 clock. Note this will give different results on different platforms and between
48 runs.
49 */
51
52 /**
53 Generates the next random number as a double value between 0 and 1.
54 */
55 double nextUniform() override;
56
57 /**
58 Generates the next random number as an unsigned 32-bit integer
59 */
60 uint32_t generateNextUInt32() override;
61
62 /**
63 Generates the next random number as an unsigned 64-bit integer
64 */
65 uint64_t generateNextUInt64() override;
66
67 /**
68 Generates the next random number as a signed 64-bit integer
69 */
70 int64_t generateNextInt64() override;
71
72 /**
73 Generates the next random number as a signed 32-bit integer
74 */
75 int32_t generateNextInt32() override;
76
77 /**
78 Seed the XOR RNG
79 */
80 void seed(uint64_t newSeed);
81
82 /**
83 Destructor for Mersenne
84 */
86
87protected:
88 uint32_t x;
89 uint32_t y;
90 uint32_t z;
91 uint32_t w;
92};
93
94} // namespace RNG
95} // namespace SST
96
97#endif // SST_CORE_RNG_XORSHIFT_H
Implements the base class for random number generators for the SST core.
Definition: rng.h:28
Implements a lightweight RNG based on XOR-shift operations.
Definition: xorshift.h:36
XORShiftRNG()
Creates a new Mersenne using a random seed which is obtained from the system clock.
Definition: xorshift.cc:29
uint32_t generateNextUInt32() override
Generates the next random number as an unsigned 32-bit integer.
Definition: xorshift.cc:68
double nextUniform() override
Generates the next random number as a double value between 0 and 1.
Definition: xorshift.cc:56
uint64_t generateNextUInt64() override
Generates the next random number as an unsigned 64-bit integer.
Definition: xorshift.cc:78
int32_t generateNextInt32() override
Generates the next random number as a signed 32-bit integer.
Definition: xorshift.cc:116
~XORShiftRNG()
Destructor for Mersenne.
Definition: xorshift.cc:140
void seed(uint64_t newSeed)
Seed the XOR RNG.
Definition: xorshift.cc:132
int64_t generateNextInt64() override
Generates the next random number as a signed 64-bit integer.
Definition: xorshift.cc:94