关于srand函数和rand函数的整理

本文详细解释了C语言和C++中rand()和srand()函数的使用方法,包括如何生成随机数序列及如何确保每次生成的随机数序列不同。通过实例演示了如何初始化随机数种子,以及如何生成指定范围内的随机数序列。
摘要由CSDN通过智能技术生成

c语言和c++中都有rand()函数和srand()函数。

1、  在使用这两个个函数时需要添加头文件#include<stdlib.h>

(C++建议使用#include<cstdlib>)

2在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关。

定义为:int rand(void)返回值为0~RAND_MAX(整形数)

    可以利用rand()%m的方法,生成0~m的一个随机的整数序列。但是我们会发现一个问题:第一次生成的数值确实是随机的但是下一次产生的数值还是一样的。

#include<iostream>

#include<cstdlib>

using namespace std;

 

int main(int argc,char*argv[])

{

    int t;

    t=rand()%10;   //产生0~10的随机数

    cout<<t;

    return 0;

}

通过结果可知第一第二次甚至第三次结果都是一样的。

    只能使用一次确实不好。那么怎么使得每次产生的数值都是随机的呢?

    这个时候就需要srand()函数了。

    srand函数是随机数发生器的初始化函数。定义为:void srand(unsigned seed);

       srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用geypid()或time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。

    例:srand(1); 直接使用1来初始化种子。不过为了防止随机数每次重复常常使用系统时间来初始化,即使用 time函数来获得系统时间,它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型再传给srand函数,即: srand((unsigned) time(&t)); 还有一个经常用法,不需要定义time_t型t变量,即: srand((unsigned) time(NULL)); 直接传入一个空指针,因为你的程序中往往并不需要经过参数获得的t数据。(注:此时需要使用头文件#include<time.h>或#include<ctime>)

#include<iostream>

#include<cstdlib>

#include<ctime>

using namespace std;

 

int main(int argc,char*argv[])

{

  int a[5];

  srand((unsigned)time(NULL));

  for(int i=0;i<5;i++)

   a[i]=rand()%10;

   for(int j=0;j<5;j++)

    cout<<a[j]<<endl;

  return 0;

}

通过此方法就可以实现产生的a[i]是一组0~10的随机数组。那么想要生成[n,m](n<m)的随机序列该怎么做呢?

a[i]=n+rand()%(m-n)

例:[2,7]

只需要将a[i]=rand()%10;改为:a[i]=2+rand()%(7-2);

需要补充的是,如果srand()放在循环的内部或者写成只有

srand((unsigned)time(NULL));

a=rand()%10;

我们会发现每次运行的结果还是相同的,为什么呢?

    电脑的随机数都是伪随机,也就是通过一定的算法得出一个数列,然后每 rand()一次就取一个数。而srand()的功能就是就是设置产生随机数的公式的参数(随机数种子),如果使用相同的种子,那么得到的随机数也就是相同的。自然,如果使用不同的种子,得出的随机数序列也是不同的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值