模块契约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)

参数

参数方向约束说明
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 会复制当前位置,两个副本随后产生相同序列。这是分支模拟和可复现测试的明确能力。

字段类型语义
Stateuint64状态字
Incrementuint64流增量(须为奇数)
Guarduint32守卫字(Ready 校验)
Reserveduint32保留字段,必须保持为零
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输入—流序号
返回值
返回含义失败时状态
无已初始化—
错误
  • XERR_ARGUMENT — 状态指针为空

范例已编译验证

random · 初始化状态

	xrtRngSeed(&Rng, 2026, 7);       /* 种子 2026,流 7 */

xrtRngReady函数

判断显式随机数状态是否已经初始化且内部约束自洽。

bool xrtRngReady(const xrng* pRng)

参数

参数方向约束说明
pRng输入非空显式状态
返回值
返回含义失败时状态
true是可用—
false不是可用—
错误
  • 无 — 纯查询,不设置错误

范例已编译验证

random_tour · 状态自检

	if ( !xrtRngReady(&RngA) ||
		(xrtRngReady(NULL)) ) {

xrtRng32函数

从显式状态生成一个 32 位伪随机数。

uint32 xrtRng32(xrng* pRng)

参数

参数方向约束说明
pRng输入已初始化显式状态
返回值
返回含义失败时状态
32 位值伪随机数—
错误
  • 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值

范例已编译验证

random · 32 位生成

	printf("explicit: %u\n", (unsigned int)xrtRng32(&Rng));

xrtRng64函数

从同一个显式状态连续生成并组合一个 64 位伪随机数。

uint64 xrtRng64(xrng* pRng)

参数

参数方向约束说明
pRng输入已初始化显式状态
返回值
返回含义失败时状态
64 位值伪随机数—
错误
  • 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、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上界(不含)
返回值
返回含义失败时状态
32 位值无偏随机数—
错误
  • 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上界(不含)
返回值
返回含义失败时状态
64 位值无偏随机数—
错误
  • 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上界(不含)
返回值
返回含义失败时状态
64 位值区间内无偏随机数—
错误
  • 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上界(含)
返回值
返回含义失败时状态
64 位值区间内无偏随机数—
错误
  • 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)

参数

参数方向约束说明
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()

参数

参数方向约束说明
无参数———
返回值
返回含义失败时状态
32 位值伪随机数—
错误
  • 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值

范例已编译验证

thread_random · 32 位生成

	printf("value: %u\n", (unsigned int)xrtRand32());

xrtRand64函数

从当前线程状态生成一个非密码学 64 位伪随机数。

uint64 xrtRand64()

参数

参数方向约束说明
无参数———
返回值
返回含义失败时状态
64 位值伪随机数—
错误
  • 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值

范例已编译验证

random_tour · 64 位生成

	(void)xrtRand64();

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上界(不含)
返回值
返回含义失败时状态
64 位值无偏随机数—
错误
  • 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上界(不含)
返回值
返回含义失败时状态
64 位值区间内无偏随机数—
错误
  • XERR_ARGUMENT — 指针为空、边界为零或区间为空
  • 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值

范例已编译验证

random_tour · 半开区间

			iMax = xrtRandRange(-5, 5);

xrtRandRangeClosed函数

从当前线程状态无偏生成闭区间 [iMin, iMax] 内的整数。

int64 xrtRandRangeClosed(int64 iMin, int64 iMax)

参数

参数方向约束说明
iMin输入—下界(含)
iMax输入>= iMin上界(含)
返回值
返回含义失败时状态
64 位值区间内无偏随机数—
错误
  • 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)

参数

参数方向约束说明
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()

参数

参数方向约束说明
无参数———
返回值
返回含义失败时状态
32 位值伪随机数—
错误
  • 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值

范例已编译验证

random_tour · 32 位生成

	(void)xrtFastRand32();

xrtFastRand64函数

从当前线程状态生成一个非密码学 64 位伪随机数。

uint64 xrtFastRand64()

参数

参数方向约束说明
无参数———
返回值
返回含义失败时状态
64 位值伪随机数—
错误
  • 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值

范例已编译验证

random_tour · 64 位生成

	(void)xrtFastRand64();

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上界(不含)
返回值
返回含义失败时状态
64 位值无偏随机数—
错误
  • 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上界(不含)
返回值
返回含义失败时状态
64 位值区间内无偏随机数—
错误
  • XERR_ARGUMENT — 指针为空、边界为零或区间为空
  • 无错误设置约束 — 本族不是密码学安全随机源,绝不可用于密钥、nonce、token、会话标识或任何攻击者可以猜测的值

范例已编译验证

random_tour · 半开区间

		int64 iRange = xrtFastRandRange(-3, 3);

xrtFastRandRangeClosed函数

从当前线程状态无偏生成闭区间 [iMin, iMax] 内的整数。

int64 xrtFastRandRangeClosed(int64 iMin, int64 iMax)

参数

参数方向约束说明
iMin输入—下界(含)
iMax输入>= iMin上界(含)
返回值
返回含义失败时状态
64 位值区间内无偏随机数—
错误
  • 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见头文件注释