【rand与srand函数求圆周率】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

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;
}

打印结果:
在这里插入图片描述
在这里插入图片描述
让我们逐步解释这行代码:

  1. time(NULL)time 函数返回当前的系统时间,通常表示从某个特定的时间点(通常是 1970 年 1 月 1 日午夜)至今的秒数。time(NULL) 返回的值是 time_t 类型的,表示秒数。

  2. (unsigned int):将 time_t 类型的秒数转换为 unsigned int 类型。这是因为 srand 函数接受的参数是 unsigned int 类型的。

  3. 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语言中生成伪随机数的两个重要函数。无论是模拟实验、密码学应用,还是简单的游戏开发,这对函数都是你的得力助手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值