19#ifndef __LAMMP_RAND_STATE_H__
20#define __LAMMP_RAND_STATE_H__
23#include "../impl/longlong.h"
34#define PCG128_DEFAULT_MULTIPLIER_HI 0x2360ED051FC65DA4ULL
35#define PCG128_DEFAULT_MULTIPLIER_LO 0x4385DF649FCCF645ULL
38#define INLINE_ static inline
47 mp_limb_t z = (seed += 0x9e3779b97f4a7c15);
48 z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
49 z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
83 mp_limb_t xsl = ((oldstate[1]) ^ oldstate[0]);
86 return (xsl >> rot) | (xsl << ((-rot) & 63));
90 const int shift =
k & 63;
91 return (x << shift) | (x >> (64 - shift));
99 rng->
s[2] ^= rng->
s[0];
100 rng->
s[3] ^= rng->
s[1];
101 rng->
s[1] ^= rng->
s[2];
102 rng->
s[0] ^= rng->
s[3];
104 rng->
s[3] =
rotl(rng->
s[3], 45);
118 if (rng->
s[0] == 0 && rng->
s[1] == 0 && rng->
s[2] == 0 && rng->
s[3] == 0) {
119 rng->
s[0] = 0xa12ef3383a3d2eefULL + seed;
120 rng->
s[1] = 0xcdfabe82ecd412ceULL + seed;
121 rng->
s[2] = 0x90b5ec55c9235815ULL + seed;
122 rng->
s[3] = 0xcfb28093ca79a3a7ULL + seed;
130#define PCG64_LE_MULTIPLIER 6364136223846793005ULL
131#define PCG64_LE_INCREMENT 1442695040888963407ULL
143#define PRIME64_0 0x9E3779B185EBCA87ULL
144#define PRIME64_1 0xC2B2AE3D27D4EB4FULL
145#define PRIME64_2 0x165667B19E3779F9ULL
146#define PRIME64_3 0x85EBCA77C2B2AE63ULL
147#define PRIME64_4 0x27D4EB2F165667C5ULL
151 for (; i + 3 < rng->
k; i += 4) {
152 s0 =
rotl(seed + i + 0, 41);
153 s1 =
rotl(seed + i + 1, 29);
154 s2 =
rotl(seed + i + 2, 23);
155 s3 =
rotl(seed + i + 3, 7);
165 for (; i < rng->
k; i++) {
166 s0 =
rotl(seed + i, 31);
185 x ^= x >> (5 + count);
186 x *= 12605985483714917081ULL;
198 for (i = 0; i + 3 < n; i += 4) {
207 for (; i < rng->
k; i++) {
#define lmmp_param_assert(x)
#define _u128add(r, x, y)
static void _umul64to128_(uint64_t a, uint64_t b, uint64_t *low, uint64_t *high)
static void pcg64_le_seq_init(pcg64_le_seq_t *rng, mp_size_t i, mp_limb_t seed)
mp_limb_t *restrict state
static mp_limb_t lmmp_xoshiro256pp_random(xoshiro256pp_state *rng)
static void pcg64_128_action(mp_limb_t state[2], const mp_limb_t inc[2])
static void lmmp_xoshiro256pp_srandom(xoshiro256pp_state *rng, mp_limb_t seed)
static mp_limb_t lmmp_seed_generator(mp_limb_t seed)
种子生成器
#define PCG64_LE_INCREMENT
#define PCG64_LE_MULTIPLIER
static mp_limb_t pcg64_le_action(mp_limb_t *restrict state)
static void lmmp_pcg64_128_srandom(pcg64_128_state *rng, mp_limb_t seed)
#define PCG128_DEFAULT_MULTIPLIER_HI
static mp_limb_t rotl(const mp_limb_t x, int k)
static mp_limb_t lmmp_pcg64_128_random(pcg64_128_state *rng)
static void pcg64_le_seq_next(mp_ptr restrict dst, mp_size_t n, pcg64_le_seq_t *rng)
#define PCG128_DEFAULT_MULTIPLIER_LO