16#ifndef __LAMMP_RAND_STATE_H__
17#define __LAMMP_RAND_STATE_H__
20#include "../impl/longlong.h"
31#define PCG128_DEFAULT_MULTIPLIER_HI 0x2360ED051FC65DA4ULL
32#define PCG128_DEFAULT_MULTIPLIER_LO 0x4385DF649FCCF645ULL
35#define INLINE_ static inline
39 const int shift =
k & 63;
40 return (x << shift) | (x >> ((-shift) & 63));
49 mp_limb_t z = (seed += 0x9e3779b97f4a7c15);
50 z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9;
51 z = (z ^ (z >> 27)) * 0x94d049bb133111eb;
67 rng->
state[0] = seed * 0x24069528d54bbaa4ULL;
68 rng->
state[1] = (seed << 17) + 0xf98bc019ecd71a28ULL;
69 rng->
inc[0] =
rotl(seed, 31) * 0xb5b2943a321cdf10ULL;
71 rng->
inc[1] = (seed << 21) ^ seed;
85 mp_limb_t xsl = ((oldstate[1]) ^ oldstate[0]);
88 return (xsl >> rot) | (xsl << ((-rot) & 63));
96 rng->
s[2] ^= rng->
s[0];
97 rng->
s[3] ^= rng->
s[1];
98 rng->
s[1] ^= rng->
s[2];
99 rng->
s[0] ^= rng->
s[3];
101 rng->
s[3] =
rotl(rng->
s[3], 45);
110 rng->
s[0] = seed ^ 0x9e37b91f8a5d7c19ULL;
111 rng->
s[1] = (seed << 17) + 0xf98bc01ecdc71a28ULL;
112 rng->
s[2] =
rotl(seed, 37) ^ (seed << 21);
113 rng->
s[3] = 0x1b30964ec95c4069ULL * seed;
120#define PCG64_LE_MULTIPLIER 6364136223846793005ULL
121#define PCG64_LE_INCREMENT 1442695040888963407ULL
133#define PRIME64_0 0x9E3779B185EBCA87ULL
134#define PRIME64_1 0xC2B2AE3D27D4EB4FULL
135#define PRIME64_2 0x165667B19E3779F9ULL
136#define PRIME64_3 0x85EBCA77C2B2AE63ULL
137#define PRIME64_4 0x27D4EB2F165667C5ULL
141 for (; i + 3 < rng->
k; i += 4) {
142 s0 =
rotl(seed + i + 0, 41);
143 s1 =
rotl(seed + i + 1, 29);
144 s2 =
rotl(seed + i + 2, 23);
145 s3 =
rotl(seed + i + 3, 7);
155 for (; i < rng->
k; i++) {
156 s0 =
rotl(seed + i, 31);
175 x ^= x >> (5 + count);
176 x *= 12605985483714917081ULL;
188 for (
i = 0;
i + 3 <
n;
i += 4) {
197 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
Copyright (C) 2026 HJimmyK(Jericho Knox)