千家信息网

c语言中如何生成随机数

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,小编给大家分享一下c语言中如何生成随机数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!生成随机数的N种方式首先需要说明的是
千家信息网最后更新 2026年11月04日c语言中如何生成随机数

小编给大家分享一下c语言中如何生成随机数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

生成随机数的N种方式

首先需要说明的是,计算机中生成的随机数严格来说都是伪随机,即非真正的随机数,真正随机数的随机样本不可重现。那么我们来看看代码中有哪些方式可以生成随机数。

rand

rand函数声明如下:

#include  int rand(void);

rand函数返回[0,RAND_MAX)范围的随机整数,在我的机器上,RAND_MAX为2147483647。

使用示例:

rand.c */ #include #include int main(void) {     int i = 0;     while(i < 5)     {         printf("%d ",rand());         i++;      }     printf("\n");     return 0; }

编译运行:

$ gcc -o rand rand.c ./rand 1804289383 846930886 1681692777 1714636915 1957747793

多运行几次,你就会惊喜地发现,每次运行的结果都是一样的!!!这还玩个毛线?

srand

别急,rand虽然每次运行的结果都是一样的,那是因为它的种子默认为1。每一个种子会有一串看似随机的序列,每次取下一个出来,整体都近乎是随机分布的。但是如果你的种子每次都是一样的,那么每次运行可能得到的结果也是一样的。我们需要利用srand给它一个种子。

#include  void srand(unsigned int seed);

为了保证我们每次的得到的随机数不一样,我们必须在每次调用时,都确保种子不一样,因此通常会选择使用时间作为种子,注意这只是通常的种子选择,你可以根据实际使用需求进行选择。

于是我们在使用之前设置好种子,使用示例:

rand.c */ #include #include #include int main(void) {     srand(time(NULL));//设置随机种子,注意只需要设置一次即可     int i = 0;     while(i < 5)//生成5个随机数     {         printf("%d ",rand());         i++;      }     printf("\n");     return 0; }

现在好了,每次运行生成的都不一样了。但是还有一个问题,如果这种方式在多线程下使用,也是不可取的,因为rand不是可重入函数。它的每次调用都会修改一些隐藏的属性,因此在多线程中使用它并不合适。

rand_r

为了在多线程下使用,我们使用rand_r,使用方式和rand是一样的:

#include  int rand_r(unsigned int *seedp);

使用示例:

#include #include #include int main(void) {     unsigned int seed = time(NULL);     int i = 0;     while(i < 5)//生成5个随机数     {         printf("%d ",rand_r(&seed));         i++;     }     printf("\n");     return 0; }

多线程中,多个线程可能几乎同时调用,那它们的种子可能也一样,如果想不一样,还可以将种子设置成和线程id有关。

unsigned int seed  = time(NULL)^pthread_self();

random

通过前面的例子可以发现,rand生成的整数范围是有限的,为了生成更大范围,可以使用random:

#include  long int random(void); void srandom(unsigned int seed);

random返回的类型为long int,因此在一定程度上,它生成的范围要大得多。另外与rand类似,需要使用srandom函数设置种子。具体的例子就不再放出了。

生成指定范围随机数

前面的例子都是生成[1,RAND_MAX]之间的数,如果要生成指定区间的随机数呢?假设a和b不超过int范围以及它们的差值不超过rand的生成范围。

[a,b)

左闭右开区间,即包含a,不包含:

(rand() % (b - a)) + a;

[a,b]

左闭右闭,即包含a和b:

(rand() % (b - a + 1)) + a;

(a,b]

左开右闭,即不包含a,包含b:

(rand() % (b-a)) + a + 1;

[0,b]

rand() % b ;

0到1之间的浮点数

rand()/(double)RAND_MAX;

举例

生成[2,10)之间的随机数5个:

#include #include #include int main(void) {     srand(time(NULL));//设置随机种子,注意只需要设置一次即可     int i = 0;     int a = 2;     int b = 10;     while(i < 5)//生成5个随机数     {         printf("%d ",( rand() % ( b - a ) )+ a);         i++;      }     printf("\n");     return 0; }

以上是"c语言中如何生成随机数"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

生成 随机数 种子 范围 线程 运行 函数 方式 之间 例子 示例 篇文章 结果 选择 语言 内容 整数 合适 惊喜 不怎么 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 九亚互联网科技 狮子座互联网科技培训 成都仁贤领冠互联网科技有限公司 互联网科技公司的市场部门 现代科技和互联网有关系吗 广州优美互联网科技 互联网教育科技公司vipkid 宁夏科技产业互联网案例 互联网科技公司实习生 国大互联网教育科技有限公司工作 洛阳共同富裕互联网科技有限公司 南博望互联网科技有限公司 济南有互联网科技公司吗 烟台灵鸽互联网科技有限公司 工业互联网山东科技大学 2021世界互联网领先科技成果发布 西安左小互联网科技有限公司 互联网对科技影响 银川新华互联网科技学校招聘 恒生科技互联网指数十大成分股 科技互联网产品 互联网和科技创新 互联网金融与金融科技 银优互联网科技有限公司 互联网科技美容 互联网公司会议桌创意科技软装饰 现代科技和互联网有关系吗 济南有互联网科技公司吗 烟台灵鸽互联网科技有限公司 互联网科技企业文化
0