LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
mprand.c
浏览该文件的文档.
1/*
2 * LAMMP - Copyright (C) 2025-2026 HJimmyK(Jericho Knox)
3 * This file is part of lammp, under the GNU LGPL v2 license.
4 * See LICENSE in the project root for the full license text.
5 */
6
7#include "../../../include/lammp/mprand.h"
8#include "../../../include/lammp/impl/rand_state.h"
9#include "../../../include/lammp/impl/tmp_alloc.h"
10
15
16#define GLOBAL_RNG_INIT_STATE 10451216379200822465ULL
17#define GLOBAL_RNG_INIT_SEED_TYPE 1
19
20void lmmp_global_rng_init_(int seed, int seed_type) {
21 lmmp_global_rng.state = lmmp_seed_generator(seed + seed_type);
22 lmmp_global_rng.seed_type = seed_type % 2;
23}
24
25mp_size_t lmmp_seed_random_(mp_ptr restrict dst, mp_size_t n, mp_limb_t seed, int seed_type) {
26 seed_type %= 2;
27 if (seed_type == 0) {
29 lmmp_pcg64_128_srandom(&rng, seed);
30 mp_size_t i = 0;
31 for (; i + 3 < n; i += 4) {
32 dst[i + 0] = lmmp_pcg64_128_random(&rng);
33 dst[i + 1] = lmmp_pcg64_128_random(&rng);
34 dst[i + 2] = lmmp_pcg64_128_random(&rng);
35 dst[i + 3] = lmmp_pcg64_128_random(&rng);
36 }
37 for (; i < n; ++i) {
38 dst[i] = lmmp_pcg64_128_random(&rng);
39 }
40 } else {
42 lmmp_xoshiro256pp_srandom(&rng, seed);
43 mp_size_t i = 0;
44 for (; i + 3 < n; i += 4) {
45 dst[i + 0] = lmmp_xoshiro256pp_random(&rng);
46 dst[i + 1] = lmmp_xoshiro256pp_random(&rng);
47 dst[i + 2] = lmmp_xoshiro256pp_random(&rng);
48 dst[i + 3] = lmmp_xoshiro256pp_random(&rng);
49 }
50 for (; i < n; ++i) {
51 dst[i] = lmmp_xoshiro256pp_random(&rng);
52 }
53 }
54 while (n > 0 && dst[n - 1] == 0) {
55 --n;
56 }
57 return n;
58}
59
61 if (n == 0 || dst == NULL) {
62 return 0;
63 }
65 seed ^= rotl(lmmp_seed_generator(n), 23);
67 return lmmp_seed_random_(dst, n, seed, lmmp_global_rng.seed_type);
68}
69
73
76
78 rng->stream.k = k;
80
81 mp_limb_t new_seed = lmmp_seed_generator(seed);
82 new_seed = rotl(new_seed, 17) ^ lmmp_seed_generator(k);
83 pcg64_le_seq_init(&rng->stream, 0, new_seed);
84 return rng;
85}
86
88 lmmp_param_assert(rng != NULL);
90 if (k <= rng->stream.k) return;
91 rng->stream.state = (mp_limb_t*)lmmp_realloc(rng->stream.state, k * sizeof(mp_limb_t));
92
93 mp_limb_t new_seed = lmmp_seed_generator(rng->stream.k);
94 new_seed = rotl(new_seed, 37) ^ lmmp_seed_generator(k);
95 pcg64_le_seq_init(&rng->stream, rng->stream.k, new_seed);
96 rng->stream.k = k;
97}
98
100 if (rng != NULL) {
101 if (rng->stream.state != NULL) {
102 lmmp_free(rng->stream.state);
103 }
104 lmmp_free(rng);
105 }
106}
107
109 lmmp_param_assert(dst != NULL);
110 lmmp_param_assert(rng != NULL);
111 lmmp_param_assert(rng->stream.state != NULL);
112 lmmp_param_assert(n > 0);
113 lmmp_param_assert(n <= rng->stream.k);
114 pcg64_le_seq_next(dst, n, &rng->stream);
115 while (n > 0 && dst[n - 1] == 0) {
116 --n;
117 }
118 return n;
119}
#define k
void * lmmp_realloc(void *ptr, size_t size)
内存重分配函数(调用lmmp_realloc_fn)
Definition memory.c:186
mp_limb_t * mp_ptr
Definition lmmp.h:215
uint64_t mp_size_t
Definition lmmp.h:212
void * lmmp_alloc(size_t size)
内存分配函数(调用lmmp_heap_alloc_fn)
Definition memory.c:166
#define LAMMP_THREAD_LOCAL
Definition lmmp.h:237
void lmmp_free(void *ptr)
内存释放函数(调用lmmp_heap_free_fn)
Definition memory.c:204
uint64_t mp_limb_t
Definition lmmp.h:211
#define lmmp_param_assert(x)
Definition lmmp.h:398
#define GLOBAL_RNG_INIT_SEED_TYPE
Definition mprand.c:17
void lmmp_global_rng_init_(int seed, int seed_type)
初始化全局随机数生成器
Definition mprand.c:20
void lmmp_strong_rng_free_(lmmp_strong_rng_t *rng)
销毁强随机数生成器
Definition mprand.c:99
mp_size_t lmmp_strong_random_(mp_ptr restrict dst, mp_size_t n, lmmp_strong_rng_t *rng)
Definition mprand.c:108
lmmp_strong_rng_t * lmmp_strong_rng_init_(mp_size_t k, int seed)
创建k维度强随机数生成器
Definition mprand.c:74
#define GLOBAL_RNG_INIT_STATE
Definition mprand.c:16
pcg64_le_seq_t stream
Definition mprand.c:71
void lmmp_strong_rng_extern_(lmmp_strong_rng_t *rng, mp_size_t k)
将rng内部状态拓展至k维度
Definition mprand.c:87
mp_size_t lmmp_seed_random_(mp_ptr restrict dst, mp_size_t n, mp_limb_t seed, int seed_type)
Definition mprand.c:25
static _Thread_local lmmp_global_rng_t lmmp_global_rng
Definition mprand.c:18
mp_size_t lmmp_random_(mp_ptr restrict dst, mp_size_t n)
Definition mprand.c:60
mp_limb_t state
Definition mprand.c:12
static void pcg64_le_seq_init(pcg64_le_seq_t *rng, mp_size_t i, mp_limb_t seed)
Definition rand_state.h:138
mp_limb_t *restrict state
Definition rand_state.h:135
static mp_limb_t lmmp_xoshiro256pp_random(xoshiro256pp_state *rng)
Definition rand_state.h:94
static void lmmp_xoshiro256pp_srandom(xoshiro256pp_state *rng, mp_limb_t seed)
Definition rand_state.h:109
mp_size_t k
Definition rand_state.h:134
static mp_limb_t lmmp_seed_generator(mp_limb_t seed)
种子生成器
Definition rand_state.h:46
static void lmmp_pcg64_128_srandom(pcg64_128_state *rng, mp_limb_t seed)
Definition rand_state.h:62
static mp_limb_t rotl(const mp_limb_t x, int k)
Definition rand_state.h:89
static mp_limb_t lmmp_pcg64_128_random(pcg64_128_state *rng)
Definition rand_state.h:77
static void pcg64_le_seq_next(mp_ptr restrict dst, mp_size_t n, pcg64_le_seq_t *rng)
Definition rand_state.h:192
#define ALLOC_TYPE(n, type)
Definition tmp_alloc.h:112