提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
rand以及srand函数的说明:
当我们需要在程序中生成伪随机数(计算机通过算法计算而得,而非真正的随机数)时,C/C++提供了 rand 和 srand 函数。这两个函数配合使用,可以创建具有一定随机性的数字序列。本文将介绍这两个函数,以及如何使用它们。
一、rand srand函数是什么?
rand 函数是C/C++标准库中的伪随机数生成函数,rand 函数生成的伪随机数是通过一种算法计算得到的,这个算法的起始点是一个被称为“随机数种子”的值。srand 函数用于设置这个种子值,从而影响 rand 函数生成的伪随机数序列。
二、使用步骤
1.引入库
代码如下(示例):
c
#include<stdlib.h>
2.rand&&srand函数的使用
以下是一个简单的示例,演示如何使用 rand 函数生成随机整数:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
int b = rand();//设置变量接收rand函数产生的伪随机数;
printf("%d ", b);
}
return 0;
}
打印结果:
我们发现每次输出的伪随机数都是相同的,这时可以通过srand函数设置随机数种子改变生成的伪随机数。
格式:srand(种子)
代码如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
srand(20);//设置20作为随机数种子;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
int b = rand();//设置变量接收rand函数产生的伪随机数;
printf("%d ", b);
}
return 0;
}
在这个例子中,我们使用 srand(20) 固定了种子值
打印结果:
若将种子修改为10:
可以发现不同的随机数种子产生的伪随机数不同。
3.时间种子
如果我们想要每次产生的伪随机数都不同,则需要一个不停变化的随机数种子即时间
引入头文件
#include<time.h>
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int n;
srand((unsigned int)time(NULL));//设置时间作为随机数种子;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
int b = rand();//设置变量接收rand函数产生的伪随机数;
printf("%d ", b);
}
return 0;
}
打印结果:
让我们逐步解释这行代码:
-
time(NULL)
:time
函数返回当前的系统时间,通常表示从某个特定的时间点(通常是 1970 年 1 月 1 日午夜)至今的秒数。time(NULL)
返回的值是time_t
类型的,表示秒数。 -
(unsigned int)
:将time_t
类型的秒数转换为unsigned int
类型。这是因为srand
函数接受的参数是unsigned int
类型的。 -
srand((unsigned int)time(NULL))
:将转换后的当前时间作为种子传递给srand
函数。这就意味着每次程序运行时,都会使用当前的系统时间作为随机数生成的起始点,从而生成不同的伪随机数序列。
4. RAND_MAX
rand函数它返回一个范围在0到 RAND_MAX之间的伪随数
RAND_MAX 是 C 标准库中的一个宏,在大多数系统中,RAND_MAX 的值是 32767(即 2^15 - 1),但这并不是绝对的,可以根据具体的实现而有所不同。
如果我们想要生成[0,10]之间的随机数:
int b = rand()%10;//只需取余数;
如果要得到[0,1)之间的浮点数:
double b = (double)rand() / RAND_MAX;
//只需并将其转化为double类型除以最大值RAND_MAX;
5.例题:求圆周率(蒙特卡洛)
题目描述:
求解圆周率可以采用蒙特卡罗方法,在一个正方形中撒点,根据在 1/4 圆内点的数量占总撒点数的比例计算圆周率值。
输入:撒点数量
输出:圆周率
这里我们使用20作为随机数种子
代码如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,k=0;
scanf("%d", &n);//输入撒点数;
srand(20);//设置随机数种子20
for (int i = 0; i < n; i++)
{
//生成随机坐标在[0,1)范围;
double x = (double)rand() / RAND_MAX;
double y = (double)rand() / RAND_MAX;
//判断坐标是否在1/4圆内
double dis = x * x + y * y;
if (dis <= 1.0)
k++;
}
//计算圆周率
double pi = (double)k / n * 4;
printf("%.8lf", pi);
return 0;
}
这里* 4:因为我们只模拟了 1/4 圆,所以我们需要将得到的比例乘以 4,以得到整个圆的比例。
整个表达式的结果 pi 就是我们估算的圆周率。
输出结果:
总结
rand 和 srand 是C语言中生成伪随机数的两个重要函数。无论是模拟实验、密码学应用,还是简单的游戏开发,这对函数都是你的得力助手。