LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
mprand.c 文件参考
+ mprand.c 的引用(Include)关系图:

浏览源代码.

结构体

struct  lmmp_global_rng_t
 
struct  lmmp_strong_rng_t
 

宏定义

#define GLOBAL_RNG_INIT_SEED_TYPE   1
 
#define GLOBAL_RNG_INIT_STATE   10451216379200822465ULL
 

类型定义

typedef struct lmmp_strong_rng_t lmmp_strong_rng_t
 

函数

void lmmp_global_rng_init_ (int seed, int seed_type)
 初始化全局随机数生成器
 
mp_size_t lmmp_random_ (mp_ptr restrict dst, mp_size_t n)
 
mp_size_t lmmp_seed_random_ (mp_ptr restrict dst, mp_size_t n, mp_limb_t seed, int seed_type)
 
mp_size_t lmmp_strong_random_ (mp_ptr restrict dst, mp_size_t n, lmmp_strong_rng_t *rng)
 
void lmmp_strong_rng_extern_ (lmmp_strong_rng_t *rng, mp_size_t k)
 将rng内部状态拓展至k维度
 
void lmmp_strong_rng_free_ (lmmp_strong_rng_t *rng)
 销毁强随机数生成器
 
lmmp_strong_rng_tlmmp_strong_rng_init_ (mp_size_t k, int seed)
 创建k维度强随机数生成器
 

变量

static _Thread_local lmmp_global_rng_t lmmp_global_rng = { 10451216379200822465ULL , 1 }
 

结构体说明

◆ lmmp_global_rng_t

struct lmmp_global_rng_t

在文件 mprand.c11 行定义.

+ lmmp_global_rng_t 的协作图:
成员变量
int seed_type
mp_limb_t state

◆ lmmp_strong_rng_t

struct lmmp_strong_rng_t

在文件 mprand.c70 行定义.

+ lmmp_strong_rng_t 的协作图:
成员变量
pcg64_le_seq_t stream

宏定义说明

◆ GLOBAL_RNG_INIT_SEED_TYPE

#define GLOBAL_RNG_INIT_SEED_TYPE   1

在文件 mprand.c17 行定义.

◆ GLOBAL_RNG_INIT_STATE

#define GLOBAL_RNG_INIT_STATE   10451216379200822465ULL

在文件 mprand.c16 行定义.

类型定义说明

◆ lmmp_strong_rng_t

函数说明

◆ lmmp_global_rng_init_()

void lmmp_global_rng_init_ ( int  seed,
int  seed_type 
)

初始化全局随机数生成器

参数
seed种子
seed_type随机数发生器类型(0:pcg64_128,1:xoshiro256++)
警告
seed_type 必须在0到1之间,如果不是,则使用 seed_type%2 作为seed_type, 如果全局种子已经初始化,则会更新全局种子,或更新发生器类型
注解
由于使用int类型作为种子,我们将会维护一个全局种子随机序列,丰富种子的随机性。

在文件 mprand.c20 行定义.

20 {
21 lmmp_global_rng.state = lmmp_seed_generator(seed + seed_type);
22 lmmp_global_rng.seed_type = seed_type % 2;
23}
static _Thread_local lmmp_global_rng_t lmmp_global_rng
Definition mprand.c:18
mp_limb_t state
Definition mprand.c:12
static mp_limb_t lmmp_seed_generator(mp_limb_t seed)
种子生成器
Definition rand_state.h:46

引用了 lmmp_global_rng, lmmp_seed_generator(), lmmp_global_rng_t::seed_type , 以及 lmmp_global_rng_t::state.

+ 函数调用图:

◆ lmmp_random_()

mp_size_t lmmp_random_ ( mp_ptr restrict  dst,
mp_size_t  n 
)

在文件 mprand.c60 行定义.

60 {
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}
uint64_t mp_limb_t
Definition lmmp.h:211
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 mp_limb_t rotl(const mp_limb_t x, int k)
Definition rand_state.h:89

引用了 lmmp_global_rng, lmmp_seed_generator(), lmmp_seed_random_(), rotl(), lmmp_global_rng_t::seed_type , 以及 lmmp_global_rng_t::state.

+ 函数调用图:

◆ lmmp_seed_random_()

mp_size_t lmmp_seed_random_ ( mp_ptr restrict  dst,
mp_size_t  n,
mp_limb_t  seed,
int  seed_type 
)

在文件 mprand.c25 行定义.

25 {
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}
uint64_t mp_size_t
Definition lmmp.h:212
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
static void lmmp_pcg64_128_srandom(pcg64_128_state *rng, mp_limb_t seed)
Definition rand_state.h:62
static mp_limb_t lmmp_pcg64_128_random(pcg64_128_state *rng)
Definition rand_state.h:77

引用了 lmmp_pcg64_128_random(), lmmp_pcg64_128_srandom(), lmmp_xoshiro256pp_random() , 以及 lmmp_xoshiro256pp_srandom().

被这些函数引用 lmmp_random_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ lmmp_strong_random_()

mp_size_t lmmp_strong_random_ ( mp_ptr restrict  dst,
mp_size_t  n,
lmmp_strong_rng_t rng 
)

在文件 mprand.c108 行定义.

108 {
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 lmmp_param_assert(x)
Definition lmmp.h:398
pcg64_le_seq_t stream
Definition mprand.c:71
mp_limb_t *restrict state
Definition rand_state.h:135
static void pcg64_le_seq_next(mp_ptr restrict dst, mp_size_t n, pcg64_le_seq_t *rng)
Definition rand_state.h:192

引用了 lmmp_param_assert, pcg64_le_seq_next(), pcg64_le_seq_t::state , 以及 lmmp_strong_rng_t::stream.

+ 函数调用图:

◆ lmmp_strong_rng_extern_()

void lmmp_strong_rng_extern_ ( lmmp_strong_rng_t rng,
mp_size_t  k 
)

将rng内部状态拓展至k维度

参数
rng强随机数生成器指针
k随机数长度(单位:limb)
警告
rng!=NULL, k>0
注解
若k<=rng->stream.k,则不进行任何操作。否则,将rng内部状态拓展至k维度。

在文件 mprand.c87 行定义.

87 {
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}
#define k
void * lmmp_realloc(void *ptr, size_t size)
内存重分配函数(调用lmmp_realloc_fn)
Definition memory.c:186
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_size_t k
Definition rand_state.h:134

引用了 pcg64_le_seq_t::k, k, lmmp_param_assert, lmmp_realloc(), lmmp_seed_generator(), pcg64_le_seq_init(), rotl(), pcg64_le_seq_t::state , 以及 lmmp_strong_rng_t::stream.

+ 函数调用图:

◆ lmmp_strong_rng_free_()

void lmmp_strong_rng_free_ ( lmmp_strong_rng_t rng)

销毁强随机数生成器

参数
rng强随机数生成器指针

在文件 mprand.c99 行定义.

99 {
100 if (rng != NULL) {
101 if (rng->stream.state != NULL) {
102 lmmp_free(rng->stream.state);
103 }
104 lmmp_free(rng);
105 }
106}
void lmmp_free(void *ptr)
内存释放函数(调用lmmp_heap_free_fn)
Definition memory.c:204

引用了 lmmp_free(), pcg64_le_seq_t::state , 以及 lmmp_strong_rng_t::stream.

+ 函数调用图:

◆ lmmp_strong_rng_init_()

lmmp_strong_rng_t * lmmp_strong_rng_init_ ( mp_size_t  k,
int  seed 
)

创建k维度强随机数生成器

参数
k随机数长度(单位:limb)
seed种子
警告
k>0
注解
请注意,此操作是一个开销很大的操作,且会分配内存,在仅生成一次的情况下,甚至初始化时间会慢于生成 一个随机数的时间。
返回
强随机数生成器指针

在文件 mprand.c74 行定义.

74 {
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}
void * lmmp_alloc(size_t size)
内存分配函数(调用lmmp_heap_alloc_fn)
Definition memory.c:166
#define ALLOC_TYPE(n, type)
Definition tmp_alloc.h:112

引用了 ALLOC_TYPE, pcg64_le_seq_t::k, k, lmmp_alloc(), lmmp_param_assert, lmmp_seed_generator(), pcg64_le_seq_init(), rotl(), pcg64_le_seq_t::state , 以及 lmmp_strong_rng_t::stream.

+ 函数调用图:

变量说明

◆ lmmp_global_rng

_Thread_local lmmp_global_rng_t lmmp_global_rng = { 10451216379200822465ULL , 1 }
static

在文件 mprand.c18 行定义.

#define GLOBAL_RNG_INIT_SEED_TYPE
Definition mprand.c:17
#define GLOBAL_RNG_INIT_STATE
Definition mprand.c:16

被这些函数引用 lmmp_global_rng_init_() , 以及 lmmp_random_().