文章目录
1 函数原型
rand()函数是伪随机数生成器,用于产生伪随机数,函数原型如下:
int rand(void)
2 参数
rand()函数无参数。
3 返回值
rand()函数返回一个int类型且范围在0~RAND_MAX之间的伪随机数,如下所述:
The rand function returns a pseudo random integer in the range 0 to RAND_MAX.
关于RAND_MAX说明如下:
- RAND_MAX 用来指明 rand() 函数所能返回的伪随机数的最大值;
- C语言标准并未明确规定RAND_MAX的值,但至少是0x7FFF = 32767。
4 SEED
在调用rand()函数之前,需要先调用srand()函数为伪随机数生成器提供seed,即设置伪随机序列的起点,如下所述:
1. Use the srand function to seed the pseudorandom-number generator before calling rand.
2. The srand function sets the starting point for generating a series of pseudorandom integers.
4.1 srand()函数
srand()函数的函数原型如下所示:
void srand( unsigned int seed );
srand()函数返回值为空;srand()函数只有一个参数seed,类型为unsigned int。
关于参数seed说明如下:
- seed相同,则rand()函数产生的伪随机序列也相同;
- 如果调用rand()函数之前从未调用过srand()函数,则seed默认值为1,C程序会自动调用srand(1)为rand()函数提供seed;
- 如果调用rand()函数之前曾经调用过srand()函数,则seed为用户指定值。
4.2 默认SEED
4.2.1 示例1
代码如下图所示:
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("rand = %d\n", rand());
}
printf("\n");
return 0;
}
代码运行结果如下图所示:
4.2.2 示例2
代码如下图所示:
int main()
{
int i = 0;
srand(1);
for (i = 0; i < 10; i++)
{
printf("rand = %d\n", rand());
}
printf("\n");
return 0;
}
代码运行结果如下图所示:
总结:示例1和2代码的运行结果相同。
4.3 指定SEED
4.3.1 示例1
代码如下图所示:
int main()
{
int i = 0;
srand(100);
for (i = 0; i < 10; i++)
{
printf("rand = %d\n", rand());
}
printf("\n");
return 0;
}
代码运行结果如下图所示:
总结:通过和4.2小节示例对比发现,seed不同,rand()函数产生的伪随机序列也不同。
4.3.2 示例2
每次调用rand()函数前都先调用srand()函数,代码如下图所示:
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
srand(i * 100);
printf("rand = %d\n", rand());
}
printf("\n");
return 0;
}
代码运行结果如下图所示:
4.4 随机SEED
只有seed值是随机的,每次运行程序时才会产生完全不同的伪随机序列。如何获取随机的seed呢?没错,将time()函数返回值作为seed。
4.4.1 time()函数
4.4.1.1 函数原型
time()函数原型如下所示:
time_t time(time_t *seconds)
4.4.1.2 参数
time()函数参数只有一个seconds,类型为time_t*,即指向time_t类型的指针;time_t类型等价于long long int类型。
4.4.1.3 返回值
time()函数返回值为time_t类型,返回的是自格林尼治时间1970年1月1日00:00:00时起到当前时刻的时长,时长单位是秒。
4.4.1.4 使用方式
time()函数有两种使用方式:
- 将空指针传递给time()函数,并将time()返回值赋给变量t,即:
t = time(NULL)
或
t = time(0)
- 将变量t的地址作为实参传递给time()函数,函数自动把结果传递给变量t,无需额外的赋值操作,即:
time(&t); // 正确
t = time(&t); // 错误
示例代码如下:
int main()
{
time_t t1, t2;
printf("time()函数第1种使用方式\n");
t1 = time(0);
printf("t1=%lld\n", t1);
printf("\n");
printf("time()函数第2种使用方式\n");
time(&t2);
printf("t2=%lld\n", t2);
printf("\n");
return 0;
}
代码运行结果如下图所示:
4.4.2 srand+time
示例代码如下图所示:
int main()
{
int i = 0;
srand((unsigned)time(0));
for (i = 0; i < 10; i++)
{
printf("rand = %d\n", rand());
}
printf("\n");
return 0;
}
示例代码说明:
- time()函数返回值类型为time_t,即long long int类型;
- srand()函数参数类型为unsigned int类型;
- 当把time()函数返回值作为 srand()函数参数参数时,需要使用(unsigned)做数据类型强转。
代码第1次运行结果:
代码第2次运行结果:
代码第3次运行结果:
5 调用
如果想要使用rand()函数产生一个(a,b)区间的伪随机数,可以使用以下方式:
rand_num = a + rand() % (b - a + 1);
需求:产生123~789之间的伪随机数,示例代码如下所示:
int main()
{
//产生123~789之间的伪随机数
int ret = 0;
int i = 0;
for (i = 0; i < 10; i++)
{
ret = 123 + rand() % (789 - 123 + 1);
printf("random number = %d\n", ret);
}
printf("\n");
return 0;
}
代码运行结果如下图所示: