c语言如何产生随机数:两种主流写法

c语言如何产生随机数,基础方案是搭配的rand()获取伪随机整数、srand()设置随机种子,进阶方案是使用C11标准的里的arc4random系列函数获取质量更高的随机值,rand()每次运行程序种子固定时输出序列完全一致,适合课堂练习、简单小游戏,不适合加密、抽奖这类对不可预测性要求较高的场景,arc4random不需要手动设置种子,随机性分布更好,多数现代编译器支持。

c语言rand与srand基础用法

你要先引入头文件和,time.h用来拿系统时间充当动态种子,time(NULL)返回从1970年1月1日到当前时刻的秒数,每秒数值都会变化,能保证每次启动程序拿到不一样的随机序列。srand只需要在程序启动阶段调用一次,放在main函数靠前位置,多次调用srand会重置随机序列,反而降低随机效果。rand函数返回的数值范围固定在0到RAND_MAX之间,RAND_MAX是宏常量,在主流编译器上数值为32767。

把rand()结果取模可以限定数值区间,想要0到99的随机数就写rand()%100,想要1到100的随机数写rand()%100+1。取模会带来分布轻微倾斜,当目标区间上限不能整除RAND_MAX时,偏大的余数出现概率略高,简单场景下该偏差影响很小。

下面是完整可直接编译的基础示例代码。

include#include#includeintmain(){srand((unsignedint)time(NULL));intnum=rand()%100+1;printf("%d",num);return0;}

c语言不同随机函数对比

函数头文件是否需要种子随机性表现
randstdlib.h需要srand设置一般,序列可复现
arc4randomstdlib.h不需要手动设置较好,分布均匀
randomstdlib.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。

敬慕百科汇集百科知识与游戏文化,带你发现世界的每一个精彩角落。

想要了解更多关于c语言如何产生随机数的文章欢迎访问:百科