【C语法学习】rand()函数

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说明如下:

  1. RAND_MAX 用来指明 rand() 函数所能返回的伪随机数的最大值;
  2. 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说明如下:

  1. seed相同,则rand()函数产生的伪随机序列也相同;
  2. 如果调用rand()函数之前从未调用过srand()函数,则seed默认值为1,C程序会自动调用srand(1)为rand()函数提供seed;
  3. 如果调用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()函数有两种使用方式:

  1. 将空指针传递给time()函数,并将time()返回值赋给变量t,即:
t = time(NULL)
或
t = time(0)
  1. 将变量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;
}

示例代码说明:

  1. time()函数返回值类型为time_t,即long long int类型;
  2. srand()函数参数类型为unsigned int类型;
  3. 当把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;
}

代码运行结果如下图所示:
在这里插入图片描述

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值