vlambda博客
学习文章列表

C语言之随机数的产生

  • 如何让系统产生一个随机数:

C语言中,我们一般使用<stdlib.h>头文件中的rand()函数来生成随机数,rand()函数取随机数的范围在0~RAND_MAX,其中RAND_MAX的值为2147483647

rand()函数的用法:

int a

a=rand()

例如:

#include<stdio.h>

#include<stdlib.h>

int main()

{

       int a;

       a =rand();

       printf("随机数值为:%d", a);

}

 

这时有细心的朋友发现了,程序每次运行时产生的随机数值是一样的。

实际上,rand()函数产生的随机数是伪随机数,是根据某一个值按照某个公式推算出来的,这个数值我们称之为“种子”,“种子”和随机数之间的关系是一个正态分布的关系。种子在每次启动计算机的时候是随机的,但是一旦计算机启动之后,他就不在变化,因此产生的随机数值也是固定的。

  • 如果要想产生真正的随机数,这时我们需要“重新播种”。

我们可以通过srand()函数来重新播种,这样的话种子就会发生变化。srand()的用法为:

void srand(unsigned int seed);

它需要一个unsignedint 类型的参数。在实际开发的过程中,我们可以用时间作为参数,只要每次的播种时间不同,那么生成的种子就不同,从而产生的随机数就不同。

使用<time.h>头文件中的time()函数即可得到当前的时间(精确到秒),就像下面这样:

srand((unsigned) time(NULL));

例如:

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

int main()

{

       int a;

       srand((unsigned)time(NULL));

       a =rand();

       printf("随机数值为:%d", a);

       return 0;

}

 

多次运行程序,会发现每次生成的随机数都不一样了。但是,这些随机数会有逐渐增大或者逐渐减小的趋势,这是因为我们以时间为种子,时间是逐渐增大的,又因为“种子”和随机数之间是一个正态分布的关系,所以我们就很容易推断出随机数也会逐渐增大或者减小。

  • 生成一定范围内的随机数

在实际的开发过程中,我们往往需要一定范围内的随机数,过大或者过小都不符合要求,那么,如何产生一定范围的随机数呢?我们可以利用取模的方法:

inta = rand() % 10;//产生0~9的随机数,注意这里的10可以被整除。

例如:

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

intmain()

{

  int a;

  srand((unsigned)time(NULL));

  a = rand()%10;

  printf("随机数值为:%d", a);

  return 0;

}

如果要规定上下限:

inta = rand() % 51+13;//产生的是13~63的数据

分析:取模即取余,rand()%51+13我们可以看成两部分:rand()%51是产生 0~50 的随机数,后面+13保证 a最小只能是 13,最大就是 50+13=63。

例如:

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

intmain()

{

  int a;

  srand((unsigned)time(NULL));

  a = rand()%51+13;

  printf("随机数值为:%d", a);

  return 0;

}

  • 生成连续的随机数

有时候我们需要一组随机数(多个随机数),该怎么生成呢?很容易想到的一种解决方案是使用循环,每次循环都重新播种,请看下面的代码:

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

int main()

{

  int a, i;

  for (i = 0; i <= 10; i++)

  {

    srand((unsigned)time(NULL));

    a = rand()%10;

    printf("%d", a);

  }

}


这时产生的随机数都是一样的,这就非常奇怪了,每次循环我们都重新播种了呀,为什么生成的随机数都一样呢?这是因为,for 循环运行速度非常快,在一秒之内就运行完成了,而 time() 函数得到的时间只能精确到秒,所以每次循环得到的时间都是一样的,这样一来,种子也就是一样的,随机数也就一样了。

好了!今天的讲述就到这里了。