c语言随机变量seed,如何产生随机数?C语言rand()和srand()用法详解
在实际编程中,我们经常需要生成随机数。因此rand()与srand()出现了,本文详解随机数相关内容
一、rand()函数相关
函数头文件:stdlib.h
函数定义:int rand(void)
函数功能:产生一个随机数
返回值:返回0至RAND_MAX之间的随机整数值
下面我们来进行编写,看下结果
#include
#include
int main(){
int a = rand();
printf("%d\n",a);
return 0;
}
当我们多次运行上面程序后发现,每次生成的数字都是一样的!所以我们来探索下rand()函数的本质:
二、rand()函数的本质——产生一个种子(一个随机数)
实际上,rand() 函数产生的随机数是伪随机数,是根据一个数值按照某个公式推算出来的,这个数值我们称之为“种子”
当我们定义了一个rand()函数,产生的虽然是随机数,但这个随机数在开始就已经产生了且不在变化
也可以说,程序运行时最开始时产生随机数,但后续就相当于一个固定值
既然只能产生一个种子(随机数),那么怎么样才能重新播种(产生新随机数)呢?
三、srand()函数——进行重新播种
函数头文件:stdlib.h
函数定义:void srand(unsinged int seed)
函数功能:设置随机数种子
函数说明:通常可以用getpid()(获取当前进程的进程识别码)或者time(NULL)(获取当前系统的时间信息)来充当种子,保持每次运行时的种子是不一样的
#include
#include
#include
int main() {
int a;
srand(time(NULL));
a = rand();
printf("%d\n", a);
return 0;
}
多次运行后,发现每次运行结果不同,随机数产生成功!
四、生成一定范围内的随机数
在实际开发中,我们往往需要一定范围内的随机数,过大或者过小都不符合要求,那么,如何产生一定范围的随机数呢?我们可以利用取余的方法:
int a = rand() % 10; //产生0~9的随机数,注意10会被整除
int a = rand() % 9+1; //产生1-9的随机数
五、连续生成随机数
利用for循环 来试一下
#include
#include
#include
int main() {
int a, i;
for (i = 0; i < 10; i++) {
srand((unsigned)time(NULL));
a = rand();
printf("%d ", a);
}
return 0;
}
运行结果.png
为什么每次运行结果都相同呢?因为某一小段时间的种子是一样的,利用for循环运行时间很短暂,time()函数只能精确到秒,但for太快,导致种子一样,那么随机数也就一样了
利用unsigned int seed = time(NULL); 定义一个时间种子seed,并在循环中每次将seed进行加减变化,srand(seed+=300)这样就表示播种时间不同了。我们将其写入程序:
#include
#include
#include
int main() {
unsigned int seed = time(NULL);
int a, i;
for (i = 0; i < 10; i++) {
seed+=300; //让播种时间不同
srand(seed);
a = rand();
printf("%d ", a);
}
return 0;
}
修改后运行结果.png
我们可以看到每次循环的结果不同,问题得到解决!
六、for循环与随机数生成函数——记数字
小游戏:最强大脑
1 2 3 4
2s后消失
输入:刚才产生的数字 1 2 3 4
输入正确后,产生多一位元素的 随机数集合 重复游戏
导入头文件
#include
#include //利用 system("cls") 当数字展示一定时间后进行清屏
#include
#include //srand(time(NULL)) time 导入头文件
#include
#include
#include
#include
int main(){
int count = 3; //记录每次生成多少个随机数
while(1)
{
unsigned int seed = time(NULL); //1000
count++; //每次多增加一个数字
//设置随机数的种子
srand(seed);
for(int i = 0; i < count; i++){
//生成一个随机数
int temp2 = rand() % 9 + 1;
printf("%d ",temp2);
}
printf("\n");
// 延时2s
Sleep(2000);
//for(int i = 0; i < 10000000000/15*2; i++);
//刷新屏幕
system("cls");
int temp;
printf("请输入:");
//重新设种子和之前生成时的种子一样
srand(seed);
//接收用户输入 一个一个接收
for(int i = 0; i < count; i++)
{
scanf("%d", &temp);
//获取对应的生成的随机数
int old = rand() % 9 + 1;
//比较输入的和随机数是否相同
printf("old:%d\n", old);
if (temp != old)
{
printf("错误 退出!\n");
exit(EXIT_SUCCESS);
}
}
printf("正确!\n");
}
return 0;
}
思路:首先产生一组随机数存储在缓冲区,再一个一个输入数字,一个一个与对应位置数字进行比对,因此利用到循环,来接受用户一个一个输入。
如何进行比对?这就需要两次生成的随机数完全一致,
感悟:要对随机数的产生有自己的理解,学会利用随机数;编写代码要有逻辑性。
c语言随机变量seed,如何产生随机数?C语言rand()和srand()用法详解相关推荐
- 784-C语言rand和srand用法详解
C语言rand和srand用法详解 在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头 ...
- c语言连续生成不同随机数_C语言随机数生成教程,C语言rand和srand用法详解
在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 头文件中的 rand() 函数来生成随机数,它的用法为: int ran ...
- 第十章 结构体_C语言随机数生成教程,C语言rand和srand用法详解
在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随 ...
- C语言随机数生成教程,C语言rand和srand用法详解
在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随 ...
- 【C语言】C语言随机数生成教程,C语言rand和srand用法详解
在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随 ...
- 【知识】C语言随机数生成,C语言rand和srand用法详解
在实际编程中,我们经常需要生成随机数.例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随 ...
- html语言中注释标记,html注释代码<!--......--> 标签的用法详解
别小看了简单的html注释代码标签,它的作用还是挺大的,对于复杂而庞大的代码量,有必要在需要说明,备注,解释的地方插入一些注释内容,方便以后编辑.修改.查询代码,还可以对某些不需要显示或执行的代码进行 ...
- R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入、生存对象生成、ggsurvplot可视化参数配置、设置、可视化对比
R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入.生存对象生成.ggsurvplot可视化参数配置.设置.可视化对比 目录 R语言使用survminer包生 ...
- php函数find的用法,c语言find函数的用法详解
c语言find函数的用法详解 C语言之find()函数 find函数用于查找数组中的某一个指定元素的位置. 比如:有一个数组[0, 0, 5, 4, 4]: 问:元素5的在什么位置,find函数 返回 ...
最新文章
- 图片html代码查看器,360度全景商品图片查看器
- python中深浅复制教程
- [转]基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动
- 变换上三角矩阵_关于马尔可夫矩阵的一些个人研究成果、思考过程及相关解释...
- HTML5标签用法及描述
- Linux arm 下载程序,arm-linux—gcc如何下载安装
- 远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
- TokenInsight:反映区块链行业整体表现的TI指数较昨日同期下跌0.25%
- 接口自动化测试中的用例编写问题总结
- 【图像分割】基于matlab GUI FCMKFCM MRI图像分割【含Matlab源码 582期】
- 软件测试主要流程分享
- linux 网络问题 ipv4 forwarding
- C语言32位系统下基本类型数据所占字节数
- 如何从“固定型”思维模式转化为“成长型”思维模式
- 微信小程序【渲染层网络层错误】解决方法
- Unity程序框架总结归置系列(1)——单例基类
- sip 180 183区别
- Java代码评审歪诗!让你写出更加优秀的代码!
- 测试工作规范及岗位职责
- Docker学习(3)-Docker镜像构建和使用
热门文章
- python中几种读取文件的方法_科学网—python中几类文件的读写 - 郗强的博文
- CNN全连接层怎么转化成一维向量?
- Excel2007 小常识
- 基于mini2440简单计算器的实现(裸机代码)
- BUUCTF [PASECA2019] honey_shop
- MySQL: 容器化方式启动
- 数据结构(C语言版)严蔚敏---图的操作的相关代码
- 在视频背景前加字html,如何在一个视频前加封面(片头) 以及配音乐, 视频如何同时加片头和背景音乐...
- 阿里云轻量级服务器远程连接数据库
- 什么是真正的用户画像