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

浏览源代码.

结构体

struct  lmmp_global_rng_t
 Copyright (C) 2026 HJimmyK(Jericho Knox) 更多...
 
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)
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 
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

Copyright (C) 2026 HJimmyK(Jericho Knox)

This file is part of LAMMP.

LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed WITHOUT ANY WARRANTY.

See https://www.gnu.org/licenses/.

在文件 mprand.c20 行定义.

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

◆ lmmp_strong_rng_t

struct lmmp_strong_rng_t

在文件 mprand.c79 行定义.

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

宏定义说明

◆ GLOBAL_RNG_INIT_SEED_TYPE

#define GLOBAL_RNG_INIT_SEED_TYPE   1

在文件 mprand.c26 行定义.

◆ GLOBAL_RNG_INIT_STATE

#define GLOBAL_RNG_INIT_STATE   10451216379200822465ULL

在文件 mprand.c25 行定义.

类型定义说明

◆ lmmp_strong_rng_t

函数说明

◆ lmmp_global_rng_init_()

void lmmp_global_rng_init_ ( int  seed,
int  seed_type 
)

Copyright (C) 2026 HJimmyK(Jericho Knox)

This file is part of LAMMP.

LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed WITHOUT ANY WARRANTY.

See https://www.gnu.org/licenses/.

初始化全局随机数生成器

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

在文件 mprand.c29 行定义.

29 {
31 lmmp_global_rng.seed_type = seed_type % 2;
32}
static _Thread_local lmmp_global_rng_t lmmp_global_rng
Definition mprand.c:27
mp_limb_t state
Definition mprand.c:21
#define n
static mp_limb_t lmmp_seed_generator(mp_limb_t seed)
种子生成器
Definition rand_state.h:48

引用了 lmmp_global_rng, lmmp_seed_generator(), n, 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.c69 行定义.

69 {
70 if (n == 0 || dst == NULL) {
71 return 0;
72 }
77}
uint64_t mp_limb_t
Definition lmmp.h:76
mp_size_t lmmp_seed_random_(mp_ptr restrict dst, mp_size_t n, mp_limb_t seed, int seed_type)
Definition mprand.c:34
static mp_limb_t rotl(const mp_limb_t x, int k)
Definition rand_state.h:38

引用了 lmmp_global_rng, lmmp_seed_generator(), lmmp_seed_random_(), n, 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.c34 行定义.

34 {
35 seed_type %= 2;
36 if (seed_type == 0) {
39 mp_size_t i = 0;
40 for (; i + 3 < n; i += 4) {
45 }
46 for (; i < n; ++i) {
48 }
49 } else {
52 mp_size_t i = 0;
53 for (; i + 3 < n; i += 4) {
58 }
59 for (; i < n; ++i) {
61 }
62 }
63 while (n > 0 && dst[n - 1] == 0) {
64 --n;
65 }
66 return n;
67}
uint64_t mp_size_t
Definition lmmp.h:77
static mp_limb_t lmmp_xoshiro256pp_random(xoshiro256pp_state *rng)
Definition rand_state.h:91
static void lmmp_xoshiro256pp_srandom(xoshiro256pp_state *rng, mp_limb_t seed)
Definition rand_state.h:106
static void lmmp_pcg64_128_srandom(pcg64_128_state *rng, mp_limb_t seed)
Definition rand_state.h:64
static mp_limb_t lmmp_pcg64_128_random(pcg64_128_state *rng)
Definition rand_state.h:79
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition rand_state.h:22

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

被这些函数引用 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.c117 行定义.

117 {
120 lmmp_param_assert(rng->stream.state != NULL);
121 lmmp_param_assert(n > 0);
123 pcg64_le_seq_next(dst, n, &rng->stream);
124 while (n > 0 && dst[n - 1] == 0) {
125 --n;
126 }
127 return n;
128}
#define lmmp_param_assert(x)
Definition lmmp.h:401
static void pcg64_le_seq_next(mp_ptr restrict dst, mp_size_t n, pcg64_le_seq_t *rng)
Definition rand_state.h:182

引用了 lmmp_param_assert, n , 以及 pcg64_le_seq_next().

+ 函数调用图:

◆ 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.c96 行定义.

96 {
99 if (k <= rng->stream.k) return;
100 rng->stream.state = (mp_limb_t*)lmmp_realloc(rng->stream.state, k * sizeof(mp_limb_t));
101
104 pcg64_le_seq_init(&rng->stream, rng->stream.k, new_seed);
105 rng->stream.k = k;
106}
#define k
void * lmmp_realloc(void *ptr, size_t size)
内存重分配函数(调用lmmp_realloc_fn)
Definition memory.c:184
static void pcg64_le_seq_init(pcg64_le_seq_t *rng, mp_size_t i, mp_limb_t seed)
Definition rand_state.h:128

引用了 k, lmmp_param_assert, lmmp_realloc(), lmmp_seed_generator(), n, pcg64_le_seq_init() , 以及 rotl().

+ 函数调用图:

◆ lmmp_strong_rng_free_()

void lmmp_strong_rng_free_ ( lmmp_strong_rng_t rng)

销毁强随机数生成器

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

在文件 mprand.c108 行定义.

108 {
109 if (rng != NULL) {
110 if (rng->stream.state != NULL) {
111 lmmp_free(rng->stream.state);
112 }
113 lmmp_free(rng);
114 }
115}
void lmmp_free(void *ptr)
内存释放函数(调用lmmp_heap_free_fn)
Definition memory.c:202

引用了 lmmp_free() , 以及 n.

+ 函数调用图:

◆ 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.c83 行定义.

83 {
85
87 rng->stream.k = k;
88 rng->stream.state = ALLOC_TYPE(k, mp_limb_t);
89
92 pcg64_le_seq_init(&rng->stream, 0, new_seed);
93 return rng;
94}
void * lmmp_alloc(size_t size)
内存分配函数(调用lmmp_heap_alloc_fn)
Definition memory.c:164
pcg64_le_seq_t stream
Definition mprand.c:80
mp_size_t k
Definition rand_state.h:124
#define ALLOC_TYPE(n, type)
Definition tmp_alloc.h:173

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

+ 函数调用图:

变量说明

◆ lmmp_global_rng

_Thread_local lmmp_global_rng_t lmmp_global_rng = { 10451216379200822465ULL , 1 }
static

在文件 mprand.c27 行定义.

#define GLOBAL_RNG_INIT_SEED_TYPE
Definition mprand.c:26
#define GLOBAL_RNG_INIT_STATE
Definition mprand.c:25

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