C语言生成随机数
强烈建议阅读 → 重新整理后的文章
2012年的时候写过一篇C语言生成随机数的博客,点击量比较高。后来发现那篇博客描述的不是非常准确,这里重新整理一遍。写惯了高级语言,现在回看C的语法,真的是挺难的^o^。
一、方法介绍
生成随机数,需要用到两个函数srand
、rand
,头文件为 #include <stdlib.h>
1.1 void srand ( unsigned int seed )
生成随机数种子,注意如果使用相同的种子后面的 rand()
函数会出现一样的随机数。常见的用法是使用一些动态的值来初始化这个种子:
srand((unsigned) time(NULL));
srand((int)getpid());
1.2 int rand ( void )
根据 srand
初始的随机数种子产生一个伪随机数(注意不是真正的随机),范围为 0 - RAND_MAX。RAND_MAX 至少为 32767,我电脑为 2147483647。可通过取模来产生不同范围的随机数,如:
int randint = rand() % (MAX + 1 - MIN) + MIN;
1.3 举例实现
下面给出了一个举例的实现(POSIX.1-2001),帮助更好的理解其原理,每次调用rand
的时候,其实是改变了一个全局变量,从而导致下一次调用返回了不同的值。
static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
next = seed;
}
二、代码举例
2.2 使用同样的随机数种子
根据上面的API说明,猜猜这10个数字会怎样?
2.3 使用不同的随机数种子
这里不调用 srand
,或者调用一次,或者每次都调用,都会产生一定的随机效果。
三、小结
随机数种子建议初始化生成一次,可以结合多个动态元素去初始化,结合具体的业务需求制定。因为这个种子会直接影响随机数的生成,如何使用不当,则达不到随机的效果。
import random
random.randint(1, 100)
Stay hungry
Stay foolish
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库