c语言如何产生随机数:两种主流写法
c语言如何产生随机数,基础方案是搭配
c语言rand与srand基础用法
你要先引入头文件
把rand()结果取模可以限定数值区间,想要0到99的随机数就写rand()%100,想要1到100的随机数写rand()%100+1。取模会带来分布轻微倾斜,当目标区间上限不能整除RAND_MAX时,偏大的余数出现概率略高,简单场景下该偏差影响很小。
下面是完整可直接编译的基础示例代码。
include
c语言不同随机函数对比
| 函数 | 头文件 | 是否需要种子 | 随机性表现 |
|---|---|---|---|
| rand | stdlib.h | 需要srand设置 | 一般,序列可复现 |
| arc4random | stdlib.h | 不需要手动设置 | 较好,分布均匀 |
| random | stdlib.h | 需要srandom设置 | 中等,部分平台可用 |
arc4random()直接返回uint32_t类型无符号整数,调用arc4random_uniform(n)可以直接得到0到n-1之间的随机数,自带去倾斜处理,不用手动做取模运算,写法更简洁。Windows平台的MSVC编译器原生不支持arc4random,Linux、macOS、安卓NDK环境可以正常编译运行。
rand属于伪随机算法。
种子相同,输出序列就完全相同,这个特性在单元测试里很有用,固定种子可以复现测试用例的运行结果。
加密场景不能使用rand、arc4random,C语言没有标准内置密码学安全随机函数,这类场景要调用操作系统提供的接口,比如Linux的getrandom,Windows的BCryptGenRandom。
如果你需要小数随机数,可以用rand()除以(double)RAND_MAX,得到0到1之间的浮点数,再缩放至目标区间,计算时强制转换浮点类型,避免整数除法直接得到0。
