模块契约Random API
当前线程便捷层
这些函数使用当前线程独立状态,不要求调用 xrtInit,也不要求线程先附着到任务运行时。多个线程之间没有共享随机锁;每个线程第一次调用时自动播种。自动种子只用于避免普通线程默认得到同一序列,不提供不可预测性。
调用 xrtRandSeed 可把当前线程重置到可复现序列。其余便捷函数和同 seed/stream 的显式状态逐值一致。
库和框架代码通常应接收或持有显式 xrng,避免隐式消费调用者线程的序列。便捷层主要服务脚本语言内建函数和短小应用。
错误与状态
- 所有返回数值的失败路径通过当前执行上下文的
xerror 补充表达错误。 - 参数或状态校验失败不会推进随机状态。
- 零是合法随机结果,不能只凭返回值判断成功;需要区分时先清理并检查
xrtGetError()。 - 成功调用不会主动清除调用前已有错误。
设计契约
XRT 把伪随机数分成两个可独立裁剪的层次:
XRT_FEATURE_RANDOM_SECURE:直接使用操作系统安全随机源,不依赖 PCG、密码算法或线程运行时。XRT_FEATURE_RANDOM_SECURE_TEXT:在系统安全随机源上生成无偏 ASCII 令牌,只依赖 random_secure。XRT_FEATURE_RANDOM:调用方持有的 PCG32 显式状态,不分配内存,不依赖线程、任务、时间或密码模块。XRT_FEATURE_RANDOM_DEFAULT:当前线程便捷状态,依赖 XRT_FEATURE_RANDOM,首次使用时自动播种,也允许显式播种以复现结果。XRT_FEATURE_RANDOM_TEXT:在显式状态上生成可复现 ASCII 文本,依赖 random。XRT_FEATURE_RANDOM_TEXT_DEFAULT:在当前线程状态上生成便捷随机文本,依赖 random_text 与 random_default。
显式状态是算法原语,也是测试、模拟、游戏、随机采样和可复现构建应优先使用的路径。便捷层只转发到同一套原语,不维护第二种随机算法。
这里的 PCG 是统计用途伪随机数,不是密码随机源。TLS、WebSocket、令牌、密码、密钥、nonce、UUID v4、临时资源名称和其他安全边界必须使用 xrtSecureRandom 或建立在其上的 Helper;不能使用 xrtRng* 或 xrtRand*。
系统安全随机
Windows 使用系统 CNG BCryptGenRandom,通过线程安全的一次性运行时解析保持单头文件无需额外导入库;成功后缓存系统入口。Linux 优先使用 getrandom,仅在旧内核不支持时回退 /dev/urandom,其他 POSIX 平台使用 /dev/urandom。旧版中已经压实的短读、EINTR、旧内核回退、并发初始化和整缓冲清零边界全部保留。
函数只有在完整填满缓冲后才返回 true。系统源失败时返回 false、清零整个输出,并设置 xrt.random / XRANDOM_ERROR_SYSTEM 结构化错误;绝不退化为 PCG、时间或进程号。空区间直接成功并允许空指针。
random_secure 是独立基础模块。密码密钥生成、TLS、临时文件、原子写和目录树暂存共同依赖它,不会让文件体系反向拉入 crypto_core。
数组洗牌
使用无偏有界采样执行原地 Fisher-Yates 洗牌,支持任意固定大小元素且不分配内存。函数先验证状态、空指针、元素大小、总字节数溢出和数组/状态重叠,再推进随机状态;失败时数组和状态都不变。空数组允许空指针并直接成功。
这个原语承接旧文档中反复手写的洗牌与随机采样底座。抽取前 N 项可以先复制数据、调用 xrtRngShuffle,再读取前 N 项;权重采样和特定概率分布仍由上层按业务规则组合。
随机文本
xrtRngText 是零分配基础 API,把固定长度文本写入调用方缓冲区并补零;容量必须至少为 length + 1。xrtRngStringFrom 创建使用自定义字母表的独立字符串,xrtRngString 使用 0-9A-Za-z-_ 组成的 URL-safe 64 字符默认字母表。对应的 xrtRandText、xrtRandStringFrom、xrtRandString 使用当前线程状态。
自定义字母表必须包含 1 至 94 个互不重复的可见 ASCII 字符。该约束保证输出始终是有效、无嵌入零的 UTF-8 文本,并防止重复字符无意改变概率权重。每个字符都通过拒绝采样选择,不产生 random % alphabet_size 的模偏差。
参数、容量、字母表和重叠会在推进 RNG 前完整检查;失败不改变输出或随机状态。调用方缓冲区不能与字母表或 xrng 状态重叠。长度为零的分配便捷函数仍返回可释放的独立空字符串。
这些 API 继承 PCG 的“可复现但可预测”属性,只适用于测试数据、模拟、游戏、明确不承担安全边界的名称和随机采样。令牌、Cookie 密钥、WebSocket nonce、密码、UUID v4、会话标识和临时资源必须使用 xrtSecureRandom、xrtSecureText 或 xrtSecureString。
旧 API 决策
xrand 改为 xrng,显式状态统一使用 xrtRng*,当前线程便捷层统一使用 xrtRand*。- 删除
Ex、Obj 和线程专用版本族。栈上 xrng 已覆盖独立对象,不需要堆分配、ptr 强转和专用销毁函数。 - 64 位输出只消费一个状态,不再要求 low/high 两个生成器。
- 原来的区间函数同时承担“自动交换边界”和“闭区间”两种隐藏规则;现在半开与闭区间分名表达,反向边界明确失败。
- 修复完整 32 位闭区间宽度转换为零后执行除零的问题,并把范围扩展到完整
int64。 - 删除普通伪随机数可生成安全 UUID/GUID 的旧文档建议。
完整示例
examples/math/random/main.c:显式状态、闭区间和单位实数。examples/math/random_secure/main.c:操作系统安全随机源和敏感缓冲清理。examples/math/random_secure_text/main.c:URL-safe 密码安全随机令牌。examples/math/thread_random/main.c:当前线程便捷状态。examples/math/random_text/main.c:显式状态可复现随机文本。examples/math/thread_random_text/main.c:当前线程便捷随机文本。
PCG 来源与许可证见 docs/THIRD_PARTY.md。
xrandomerror类型
操作系统安全随机源稳定错误代码。
| 值 | 语义 |
|---|
XRANDOM_ERROR_SYSTEM | 系统随机源失败 |
typedef enum xrandomerror { XRANDOM_ERROR_SYSTEM = 1 } xrandomerror;
安全文本与令牌
xrtSecureRandom函数
使用操作系统密码安全随机源填满缓冲;失败时清零整个输出。
bool xrtSecureRandom(ptr pData, size_t iSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pData | 输出 | 非空 | 接收缓冲 |
iSize | 输入 | > 0 | 缓冲字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已填满密码安全随机字节 | — |
false | 系统随机源失败,输出已清零 | XERR_IO |
错误XERR_ARGUMENT — 指针为空或长度为零XERR_IO — 操作系统随机源读取失败
范例已编译验证
random_secure · 系统安全随机
if ( !xrtSecureRandom(arrId, sizeof(arrId)) ) {
xrtSecureText函数
使用操作系统安全随机源和自定义字母表写入随机文本并补零。
bool xrtSecureText(xstrview Alphabet, char* sOutput, size_t iCapacity, size_t iLength)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Alphabet | 输入 | 借用、非空 | 字母表 |
sOutput | 输出 | 非空 | 输出缓冲 |
iCapacity | 输入 | > iLength | 容量,须含末尾零 |
iLength | 输入 | — | 文本长度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已写入并补零 | — |
false | 失败 | XERR_ARGUMENT / XERR_IO |
错误XERR_ARGUMENT — 字母表为空、容量不足或指针为空XERR_IO — 操作系统随机源读取失败
范例已编译验证
random_tour · 安全随机文本
if ( !xrtSecureText(SV(sHex), TextA, sizeof(TextA), 8u) ||
!exampleInAlphabet(TextA, 8u, SV(sHex)) ) {
xrtSecureStringFrom函数
使用自定义字母表创建由 xrtFree 释放的密码安全随机字符串。
str xrtSecureStringFrom(xstrview Alphabet, size_t iLength)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Alphabet | 输入 | 借用、非空 | 字母表 |
iLength | 输入 | — | 字符串长度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 零结尾字符串,xrtFree 释放 | — |
NULL | 失败 | XERR_ARGUMENT / XERR_IO / XERR_MEMORY |
错误XERR_ARGUMENT — 字母表为空或长度非法XERR_IO — 系统随机源失败XERR_MEMORY — 分配失败
范例已编译验证
random_tour · 安全随机字符串(自定义字母表)
sGenerated = xrtSecureStringFrom(SV(sHex), 8u);
xrtSecureString函数
使用 URL-safe 64 字符字母表创建密码安全随机字符串。
str xrtSecureString(size_t iLength)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 零结尾字符串,xrtFree 释放 | — |
NULL | 失败 | XERR_ARGUMENT / XERR_IO / XERR_MEMORY |
错误XERR_ARGUMENT — 长度非法XERR_IO — 系统随机源失败XERR_MEMORY — 分配失败
范例已编译验证
random_secure_text · 安全随机字符串
str sToken = xrtSecureString(32); /* 32 字符 ≈ 192 位熵 */
显式状态
xrng类型
状态可放在栈、对象、任务或用户自定义线程上下文中,不需要创建和销毁堆对象。字段公开是为了让 C 用户控制存储、复制状态和嵌入结构,不代表允许直接修改。每个状态由一个线程或外部同步保护;不同状态可以完全并行。 按值复制 xrng 会复制当前位置,两个副本随后产生相同序列。这是分支模拟和可复现测试的明确能力。
| 字段 | 类型 | 语义 |
|---|
State | uint64 | 状态字 |
Increment | uint64 | 流增量(须为奇数) |
Guard | uint32 | 守卫字(Ready 校验) |
Reserved | uint32 | 保留字段,必须保持为零 |
typedef struct xrng { uint64 State; uint64 Increment; uint32 Guard; uint32 Reserved; } xrng;
XRT_RNG_INITIALIZER常量
静态初始化得到固定有效状态,适合无需自定义 seed 的确定性路径。多数程序仍应调用 xrtRngSeed,明确记录 seed 与 stream。
xrng Rng = XRT_RNG_INITIALIZER;
数组洗牌
xrtRngSeed函数
用 seed 和 stream 初始化或重置一个显式随机数状态。
void xrtRngSeed(xrng* pRng, uint64 iSeed, uint64 iStream)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pRng | 输出 | 非空 | 显式状态 |
iSeed | 输入 | — | 种子 |
iStream | 输入 | — | 流序号 |
范例已编译验证
random · 初始化状态
xrtRngSeed(&Rng, 2026, 7); /* 种子 2026,流 7 */
xrtRngReady函数
判断显式随机数状态是否已经初始化且内部约束自洽。
bool xrtRngReady(const xrng* pRng)
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 是可用 | — |
false | 不是可用 | — |
范例已编译验证
random_tour · 状态自检
if ( !xrtRngReady(&RngA) ||
(xrtRngReady(NULL)) ) {
xrtRng32函数
从显式状态生成一个 32 位伪随机数。
uint32 xrtRng32(xrng* pRng)
错误- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
random · 32 位生成
printf("explicit: %u\n", (unsigned int)xrtRng32(&Rng));
xrtRng64函数
从同一个显式状态连续生成并组合一个 64 位伪随机数。
uint64 xrtRng64(xrng* pRng)
错误- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
random_tour · 64 位生成
if ( xrtRng64(&RngA) != xrtRng64(&RngB) ) {
xrtRngBytes函数
按稳定的小端字节顺序填充缓冲区;同一状态在所有平台产生相同结果。
bool xrtRngBytes(xrng* pRng, ptr pData, size_t iSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pRng | 输入 | 已初始化 | 显式状态 |
pData | 输出 | 非空 | 接收缓冲 |
iSize | 输入 | > 0 | 字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已填充 | — |
false | 参数非法 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 状态未初始化、缓冲为空或长度为零
范例已编译验证
random · 字节填充
if ( !xrtRngBytes(&Rng, arrBytes, sizeof(arrBytes)) ||
!xrtRngShuffle(&Rng, arrOrder,
sizeof(arrOrder) / sizeof(arrOrder[0]), sizeof(arrOrder[0])) ) {
xrtRngBelow32函数
无偏生成 [0, iBound) 内的 32 位整数。
uint32 xrtRngBelow32(xrng* pRng, uint32 iBound)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pRng | 输入 | 已初始化 | 显式状态 |
iBound | 输入 | > 0 | 上界(不含) |
错误XERR_ARGUMENT — 指针为空、边界为零或区间为空- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
random_tour · 32 位无偏上界
uint32 uA = xrtRngBelow32(&RngA, 100u);
xrtRngBelow64函数
无偏生成 [0, iBound) 内的 64 位整数。
uint64 xrtRngBelow64(xrng* pRng, uint64 iBound)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pRng | 输入 | 已初始化 | 显式状态 |
iBound | 输入 | > 0 | 上界(不含) |
错误XERR_ARGUMENT — 指针为空、边界为零或区间为空- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
random_tour · 64 位无偏上界
uint64 uA = xrtRngBelow64(&RngA,
UINT64_C(1000000));
xrtRngRange函数
无偏生成半开区间 [iMin, iMax) 内的整数。
int64 xrtRngRange(xrng* pRng, int64 iMin, int64 iMax)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pRng | 输入 | 已初始化 | 显式状态 |
iMin | 输入 | — | 下界(含) |
iMax | 输入 | > iMin | 上界(不含) |
错误XERR_ARGUMENT — 指针为空、边界为零或区间为空- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
random_tour · 半开区间
int64 iA = xrtRngRange(&RngA, -100, 100);
xrtRngRangeClosed函数
无偏生成闭区间 [iMin, iMax] 内的整数,包括完整 int64 域。
int64 xrtRngRangeClosed(xrng* pRng, int64 iMin, int64 iMax)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pRng | 输入 | 已初始化 | 显式状态 |
iMin | 输入 | — | 下界(含) |
iMax | 输入 | >= iMin | 上界(含) |
错误XERR_ARGUMENT — 指针为空、边界为零或区间为空- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
random · 闭区间
printf("dice : %lld\n", (long long)xrtRngRangeClosed(&Rng, 1, 6));
xrtRngReal函数
生成半开区间 [0.0, 1.0) 内具有 53 位精度的双精度数。
double xrtRngReal(xrng* pRng)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| double | [0.0, 1.0) 内随机数 | — |
错误- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
random · 单位实数
printf("real : %.12f\n", xrtRngReal(&Rng));
xrtRngShuffle函数
使用 Fisher-Yates 算法原地打乱定长元素数组,不执行内存分配。
bool xrtRngShuffle(xrng* pRng, ptr pData, size_t iCount, size_t iItemSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pRng | 输入 | 已初始化 | 显式状态 |
pData | 输入/输出 | 非空 | 元素数组 |
iCount | 输入 | — | 元素数量 |
iItemSize | 输入 | > 0 | 单元素字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已打乱 | — |
false | 参数非法 | XERR_ARGUMENT / XERR_RANGE |
错误XERR_ARGUMENT — 指针为空或元素大小为零XERR_RANGE — iCount * iItemSize 溢出XERR_STATE — 状态未初始化
范例已编译验证
random · 数组洗牌
!xrtRngShuffle(&Rng, arrOrder,
sizeof(arrOrder) / sizeof(arrOrder[0]), sizeof(arrOrder[0])) ) {
xrtRngText函数
把可复现随机文本写入调用方缓冲区并补零。
bool xrtRngText(xrng* pRng, xstrview Alphabet, char* sOutput, size_t iCapacity, size_t iLength)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pRng | 输入 | 已初始化 | 显式状态 |
Alphabet | 输入 | 借用、非空 | 字母表 |
sOutput | 输出 | 非空 | 输出缓冲 |
iCapacity | 输入 | > iLength | 容量 |
iLength | 输入 | — | 文本长度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已写入并补零 | — |
false | 参数非法 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 状态未初始化、字母表为空或容量不足
范例已编译验证
random_tour · 随机文本
if ( !xrtRngText(&RngA, SV(sHex), TextA, sizeof(TextA), 8u) ||
!xrtRngText(&RngB, SV(sHex), TextB, sizeof(TextB), 8u) ||
(memcmp(TextA, TextB, 8u) != 0) ||
!exampleInAlphabet(TextA, 8u, SV(sHex)) ) {
xrtRngStringFrom函数
使用自定义字母表创建由 xrtFree 释放的可复现随机字符串。
str xrtRngStringFrom(xrng* pRng, xstrview Alphabet, size_t iLength)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pRng | 输入 | 已初始化 | 显式状态 |
Alphabet | 输入 | 借用、非空 | 字母表 |
iLength | 输入 | — | 字符串长度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 零结尾字符串,xrtFree 释放 | — |
NULL | 失败 | XERR_ARGUMENT / XERR_MEMORY |
错误XERR_ARGUMENT — 状态未初始化或字母表为空XERR_MEMORY — 分配失败
范例已编译验证
random_tour · 随机字符串(自定义字母表)
sGenerated = xrtRngStringFrom(&RngA, SV(sHex), 12u);
xrtRngString函数
使用 URL-safe 64 字符字母表创建可复现随机字符串。
str xrtRngString(xrng* pRng, size_t iLength)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pRng | 输入 | 已初始化 | 显式状态 |
iLength | 输入 | — | 字符串长度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 零结尾字符串,xrtFree 释放 | — |
NULL | 失败 | XERR_ARGUMENT / XERR_MEMORY |
错误XERR_ARGUMENT — 状态未初始化或长度非法XERR_MEMORY — 分配失败
范例已编译验证
random_text · 随机字符串
sText = xrtRngString(&Rng, 24);
旧 API 决策
xrtRandSeed函数
重置当前线程的快速伪随机数状态;与 xrtFastRand* 别名族共享同一线程状态。
void xrtRandSeed(uint64 iSeed, uint64 iStream)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iSeed | 输入 | — | 种子 |
iStream | 输入 | — | 流序号 |
范例已编译验证
thread_random · 重置线程状态
xrtRandSeed(2026, 7); /* 重置本线程状态 → 序列可复现 */
xrtRand32函数
从当前线程状态生成一个非密码学 32 位伪随机数。
uint32 xrtRand32()
错误- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
thread_random · 32 位生成
printf("value: %u\n", (unsigned int)xrtRand32());
xrtRand64函数
从当前线程状态生成一个非密码学 64 位伪随机数。
uint64 xrtRand64()
错误- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
xrtRandBytes函数
使用当前线程非密码学随机状态按稳定的小端顺序填充字节。
bool xrtRandBytes(ptr pData, size_t iSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pData | 输出 | 非空 | 接收缓冲 |
iSize | 输入 | > 0 | 字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已填充 | — |
false | 参数非法 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 缓冲为空或长度为零
范例已编译验证
random_tour · 字节填充
if ( !xrtRandBytes(Buffer, sizeof(Buffer)) ) {
xrtRandBelow函数
从当前线程状态无偏生成 [0, iBound) 内的整数。
uint64 xrtRandBelow(uint64 iBound)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iBound | 输入 | > 0 | 上界(不含) |
错误XERR_ARGUMENT — 指针为空、边界为零或区间为空- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
random_tour · 无偏上界
if ( (xrtRandBelow(10u) >= 10u) ||
(xrtRandBelow(1u) != 0u) ) {
xrtRandRange函数
从当前线程状态无偏生成半开区间 [iMin, iMax) 内的整数。
int64 xrtRandRange(int64 iMin, int64 iMax)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iMin | 输入 | — | 下界(含) |
iMax | 输入 | > iMin | 上界(不含) |
错误XERR_ARGUMENT — 指针为空、边界为零或区间为空- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
xrtRandRangeClosed函数
从当前线程状态无偏生成闭区间 [iMin, iMax] 内的整数。
int64 xrtRandRangeClosed(int64 iMin, int64 iMax)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iMin | 输入 | — | 下界(含) |
iMax | 输入 | >= iMin | 上界(含) |
错误XERR_ARGUMENT — 指针为空、边界为零或区间为空- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
thread_random · 闭区间
printf("dice : %lld\n", (long long)xrtRandRangeClosed(1, 6));
xrtRandReal函数
从当前线程状态生成 [0.0, 1.0) 内的双精度数。
double xrtRandReal()
返回值| 返回 | 含义 | 失败时状态 |
|---|
| double | [0.0, 1.0) 内随机数 | — |
错误- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
thread_random · 单位实数
printf("real : %.12f\n", xrtRandReal());
xrtRandShuffle函数
使用当前线程随机状态原地打乱定长元素数组。
bool xrtRandShuffle(ptr pData, size_t iCount, size_t iItemSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pData | 输入/输出 | 非空 | 元素数组 |
iCount | 输入 | — | 元素数量 |
iItemSize | 输入 | > 0 | 单元素字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已打乱 | — |
false | 参数非法 | XERR_ARGUMENT / XERR_RANGE |
错误XERR_ARGUMENT — 指针为空或元素大小为零XERR_RANGE — 尺寸乘法溢出
范例已编译验证
random_tour · 数组洗牌
if ( !xrtRandShuffle(Numbers, 6u, sizeof(int)) ) {
xrtRandText函数
使用当前线程随机状态把文本写入调用方缓冲区并补零。
bool xrtRandText(xstrview Alphabet, char* sOutput, size_t iCapacity, size_t iLength)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Alphabet | 输入 | 借用、非空 | 字母表 |
sOutput | 输出 | 非空 | 输出缓冲 |
iCapacity | 输入 | > iLength | 容量 |
iLength | 输入 | — | 文本长度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已写入并补零 | — |
false | 参数非法 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 字母表为空、容量不足或指针为空
范例已编译验证
random_tour · 随机文本
if ( !xrtRandText(SV(sHex), TextA, sizeof(TextA), 8u) ||
!exampleInAlphabet(TextA, 8u, SV(sHex)) ) {
xrtRandStringFrom函数
使用当前线程随机状态和自定义字母表创建随机字符串。
str xrtRandStringFrom(xstrview Alphabet, size_t iLength)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
Alphabet | 输入 | 借用、非空 | 字母表 |
iLength | 输入 | — | 字符串长度 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 零结尾字符串,xrtFree 释放 | — |
NULL | 失败 | XERR_ARGUMENT / XERR_MEMORY |
错误XERR_ARGUMENT — 字母表为空或长度非法XERR_MEMORY — 分配失败
范例已编译验证
random_tour · 随机字符串(自定义字母表)
sGenerated = xrtRandStringFrom(SV(sHex), 16u);
xrtRandString函数
使用当前线程随机状态和默认字母表创建随机字符串。
str xrtRandString(size_t iLength)
返回值| 返回 | 含义 | 失败时状态 |
|---|
| 非空 | 零结尾字符串,xrtFree 释放 | — |
NULL | 失败 | XERR_ARGUMENT / XERR_MEMORY |
错误XERR_ARGUMENT — 长度非法XERR_MEMORY — 分配失败
范例已编译验证
random_tour · 随机字符串
sGenerated = xrtRandString(12u);
xrtFastRandSeed函数
重置当前线程的快速伪随机数状态;旧 xrtRand* 名称是本族的兼容别名。
void xrtFastRandSeed(uint64 iSeed, uint64 iStream)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iSeed | 输入 | — | 种子 |
iStream | 输入 | — | 流序号 |
范例已编译验证
random_tour · 重置线程状态
xrtFastRandSeed(12345u, 67890u);
xrtFastRand32函数
从当前线程状态生成一个非密码学 32 位伪随机数。
uint32 xrtFastRand32()
错误- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
xrtFastRand64函数
从当前线程状态生成一个非密码学 64 位伪随机数。
uint64 xrtFastRand64()
错误- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
xrtFastRandBytes函数
使用当前线程非密码学随机状态按稳定的小端顺序填充字节。
bool xrtFastRandBytes(ptr pData, size_t iSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pData | 输出 | 非空 | 接收缓冲 |
iSize | 输入 | > 0 | 字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已填充 | — |
false | 参数非法 | XERR_ARGUMENT |
错误XERR_ARGUMENT — 缓冲为空或长度为零
范例已编译验证
random_tour · 字节填充
if ( !xrtFastRandBytes(BytesA, sizeof(BytesA)) ) {
xrtFastRandBelow函数
从当前线程状态无偏生成 [0, iBound) 内的整数。
uint64 xrtFastRandBelow(uint64 iBound)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iBound | 输入 | > 0 | 上界(不含) |
错误XERR_ARGUMENT — 指针为空、边界为零或区间为空- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
random_tour · 无偏上界
if ( (xrtFastRandBelow(7u) >= 7u) ||
(iRange < -3) || (iRange > 3) ||
(xrtFastRandRangeClosed(1, 1) != 1) ) {
xrtFastRandRange函数
从当前线程状态无偏生成半开区间 [iMin, iMax) 内的整数。
int64 xrtFastRandRange(int64 iMin, int64 iMax)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iMin | 输入 | — | 下界(含) |
iMax | 输入 | > iMin | 上界(不含) |
错误XERR_ARGUMENT — 指针为空、边界为零或区间为空- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
random_tour · 半开区间
int64 iRange = xrtFastRandRange(-3, 3);
xrtFastRandRangeClosed函数
从当前线程状态无偏生成闭区间 [iMin, iMax] 内的整数。
int64 xrtFastRandRangeClosed(int64 iMin, int64 iMax)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
iMin | 输入 | — | 下界(含) |
iMax | 输入 | >= iMin | 上界(含) |
错误XERR_ARGUMENT — 指针为空、边界为零或区间为空- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
random_tour · 闭区间
(xrtFastRandRangeClosed(1, 1) != 1) ) {
xrtFastRandReal函数
从当前线程状态生成 [0.0, 1.0) 内的双精度数。
double xrtFastRandReal()
返回值| 返回 | 含义 | 失败时状态 |
|---|
| double | [0.0, 1.0) 内随机数 | — |
错误- 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值
范例已编译验证
random_tour · 单位实数
double dReal = xrtFastRandReal();
xrtFastRandShuffle函数
使用当前线程随机状态原地打乱定长元素数组。
bool xrtFastRandShuffle(ptr pData, size_t iCount, size_t iItemSize)
参数
| 参数 | 方向 | 约束 | 说明 |
|---|
pData | 输入/输出 | 非空 | 元素数组 |
iCount | 输入 | — | 元素数量 |
iItemSize | 输入 | > 0 | 单元素字节数 |
返回值| 返回 | 含义 | 失败时状态 |
|---|
true | 已打乱 | — |
false | 参数非法 | XERR_ARGUMENT / XERR_RANGE |
错误XERR_ARGUMENT — 指针为空或元素大小为零XERR_RANGE — 尺寸乘法溢出
范例已编译验证
random_tour · 数组洗牌
if ( !xrtFastRandShuffle(Numbers, 4u, sizeof(int)) ) {
常量索引常量
以下常量在本页所属头文件中定义,语义见公共头注释。
| 常量 | 说明 |
| XRANDOM_ERROR_SYSTEM | 见头文件注释 |