随机数的生成

本文介绍了C语言中rand()函数生成伪随机数的工作原理,强调了使用srand()设置种子以实现真正随机性,并展示了如何利用time()函数获取当前时间作为种子。还给出了不同范围随机数生成的方法。
摘要由CSDN通过智能技术生成

目录

1.rand函数


1.rand函数

想要实现随机数,c语言中为我们提供了rand函数。

int rand (void);

rand()函数是一个用来生成伪随机数的函数。它返回一个范围在0到RAND_MAX之间的整数,其RAND_MAX是一个常量,代表了rand()函数能够生成的最大随机数值。一般情况下,为32767.

rand函数的使⽤需要包含⼀个头⽂件是:<stdlib.h>

但是为什么称之为伪随机呢?我们来测试一下。

#include <stdio.h>
#include <stdlib.h>
int main()
{
 printf("%d\n", rand());
 printf("%d\n", rand());
 printf("%d\n", rand());
 printf("%d\n", rand());
 printf("%d\n", rand());
 return 0;
}

我们来运行一下,看看结果:

 

虽然一次运行中的5个数字是相对随机的,但是下⼀次运⾏程序⽣成的结果和上⼀次一模一样,这就说明有点问题。这就是我们所称的伪随机。

其实我们到cpluplus官网去看,可以发现

This number is generated by an algorithm that returns a sequence of apparently non-related numbers each time it is called. This algorithm uses a seed to generate the series, which should be initialized to some distinctive value using function 

这个数字是由一个算法生成的,该算法在每次调用时都会返回一个明显不相关的数字序列。该算法使用种子来生成序列,每个种子对应的序列是固定的,而rand函数默认的种子是1,所以会导致伪随机的现象。

所以我们就需要另一个函数srand来改变种子的值,实现真正的随机。

2.srand函数

void srand (unsigned int seed);

srand()函数用于设置随机数生成器的种子,以便在调用rand()函数时生成不同的随机数序列。

要使用srand()函数,你需要包含<stdlib.h>头文件。

srand()函数接受一个参数,通常是一个整数值,用作随机数生成器的种子。也就是说,只要种子在不断变化,就能产生真正的随机数。

所以我们要产生一个不断变化的整数(没必要随机,否则你需要一个随机数来实现随机数的生成,显然矛盾)。

3.time函数

在程序中我们⼀般是使⽤程序运⾏的时间作为种子的,因为时间时刻在发⽣变化的。

在C语⾔中有⼀个函数叫 time ,就可以获得这个时间,time函数原型如下:

time_t time (time_t* timer);

time 函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运⾏时间之间的 差值,单位是秒。

返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。

time函数的参数 timer 如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。 如果 timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳

time函数的时候需要包含头⽂件:<time.h>

如果只是让time函数返回时间戳,我们就可以这样写:

time(NULL);

 

4.生成随机数

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
     //使⽤time函数的返回值设置种⼦
     //因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换
	srand((unsigned int)time(NULL));
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());

	return 0;
}

PS:截图只是当时程序运⾏的结果,你的运⾏结果不⼀定和这个⼀样.

5.随机数的范围

1.如果我们要生成0~99之间的随机数,方法如下:

 rand() %100;//余数的范围是0~99

2.如果我们要生成1~100之间的随机数,方法如下:

 rand()%100+1;//%100的余数是0~99,0~99的数字+1,范围是1~100

3.如果我们要生成100~200之间的随机数,方法如下:

100 + rand()%(200-100+1) //余数的范围是0~100,加100后就是100~200

4.如果我们要生成a~b之间的随机数,方法如下:

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值