C语言中随机数生成详解

产生随机数的函数

在C语言中产生随机数的函数 int rand(void); void表示不需要参数传递

rand()函数在 <stdlib.h>库中,所以需要引用此头文件

例如:产生一组随机数

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

在这里插入图片描述


rand函数详解:

通过产生上面的一组随机数,我相信大家已经知道了rand()函数的用法,但是我们可以明显的发现,在每次运行完上述代码后再次运行的时候,此时产生的随机数怎么和上一次产生的随机数是一样的呢?
在这里插入图片描述
An integer value between 0 and RAND_MAX.就是rand() 函数的返回值,一个介于0~32767之间的数。
但是为什么产生的随机数每次都是一样的呢?


srand() 函数:

其实,这是因为rand()随机生成的随机数是伪随机数,是根据一个数值按照某个公式推算出来的,这个数值我们称之为“种子”。

种子在每次启动计算机时是随机的,但是一旦计算机启动以后它就不再变化了;也就是说,每次启动计算机以后,种子就是定值了,所以根据公式推算出来的结果(也就是生成的随机数)就是固定的。

Use the srand function to seed the pseudorandom-number generator before calling rand 所以我们需要在调用rand之前,使用srand函数为伪随机数发生器添加变化的种子。

void srand(unsigned int seed) 包含的头文件<stdlib.h>
返回值为 None

我们通过函数原型可以看到,srand() 函数需要一个无符号整形的一个种子参数,如果srand() 函数每次传入的种子相同的话,那么rand() 函数生成的随机值也是相同的,这在某种意义上并不随机了。


time() 函数 :

1. time()函数的用途

time_t time(time_t *t);

函数说明:此函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数(即格林尼治时间1970年1月1日00:00:00到当前时刻的时长,时长单位是秒)。如果t并非空指针的话,此函数也会将返回值存在t指针所指的内存。

返回值:如果参数不是空指针,则返回值与存储在参数Timer所指向的位置的值相同。如果该函数不能检索到日历时间,它将返回一个值-1。

time_t是一个基本算术类型(long long类型)的别名,能够代表时间。

2. time()函数的头文件

要使用time() 函数,需要在程序中包含 #include <time.h> 头文件

3. time()函数的使用样例

time() 函数有两种使用方式:

将空指针传递给time()函数,并将time()返回值赋给变量time1

//第一种使用方式
#include <stdio.h>
#include <time.h>
int main()
{
	time_t time1;
    time1 = time(0);   
    time1 = time(NULL);
    printf("time1=%lld\n", time1);
	return 0;
}

将变量time2的地址作为实参传递给time()函数,函数自动把结果传递给time2,不需要额外的赋值语句。

//第二种使用方式
#include <stdio.h>
#include <time.h>
int main()
{
	time_t time2;
    time(&time2);    
    printf("time2=%lld", time2);
	return 0;
}

总结

我们只需要给time() 函数传空指针NULL,它会给我们返回当前时间的时间戳。这样的话就可以实现时间种子生成随机数。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
	srand((unsigned int)time(NULL));
	printf("%d", rand());
	return 0;
}
生成范围随机数
//生成[0,9]之间的随机数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
	srand((unsigned int)time(NULL));
	printf("%d", rand()%10);
	return 0;
}
//生成[1,10]之间的随机数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
	srand((unsigned int)time(NULL));
	printf("%d", rand()%10+1);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值