VS2010中srand和rand产生随机数的用法

原文地址:https://blog.csdn.net/na_beginning/article/details/39932535

1.VC和VS2010中srand()和rand()函数的区别    
   在VC中rand()和srand()函数是包含在math.h头文件中,在使用时需要添加#include "math.h"或者#include <math.h>,但是在VS2010中srand()和rand()是包含在stdlib.h中的,在使用时需要添加语句#include "stdlib.h"或者#include <stdlib.h>。
2.VS2010中srand()和rand()函数的用法
     VS2010中通常用srand()和rand()联合使用来产生随机数,用srand(unsigned int seed)来生成seed,然后通过rand()来产生随机数。它们的原始定义都包含在“根目录\visual studio 2010\VC\crt\src\rand.c"中。

(1)关于srand的讨论 
      srand(unsigned int seed)无返回值,但是有形参,通常形参有两种形式,一种是常数,如srand(0),srand(1)等,另一种是嵌入函数,这时候通常会需要包含另外的头文件,time.h等,如srand(time(null)),srand(rand()%5)等等。

      srand函数放在循环内时用rand()产生随机数时每次产生的随机数都一样,执行多少遍都一样。代码如下:

#include "stdafx.h"
#include "stdlib.h"
//#include "time.h"
#define SIZE 10
 
int _tmain(int argc, _TCHAR* argv[])
{
    int i,j;
    for(i=0;i<4;i++)
    {
        int a[4];
        srand(0);
        //srand(time(0));
        for(j=0;j<4;j++)
        {
            a[j]=rand()%SIZE;
            printf("%d    ",a[j]);
        }
        printf("\n");
    }
    return 0;
}

     由此可见循环内使用srand时rand()每次产生的随机数都一样。

     上述代码中将srand(0)放到外层循环外,这时rand()产生的随机数每次都不一样。

改进后的运行结果为:

     由此可见循环外使用srand时rand()每次产生的随机数都不一样。

     如果要了解srand(0)和srand(1)的区别可参阅参考来源[2]。

(2)关于rand()的讨论
     rand()用来从srand()伪随机数结果中产生随机数,没有形参,有返回值,返回值为处于0~32767之间的随机数,通常我们用取余”%“的方法来得到我们想要的区间内的随机数,比如rand()%10即可得到0~9之间的任意随机数。

    如果我们想要获得1~10之间的随机数的时候怎么办呢?这时候加一就可以了,即1+rand()%10。

    由此得到一般规律,我们想要得到0~(N-1)之间的随机数时我们可以采用如下步骤:

    方法一:直接用rand()%N;

    方法二:先定义#define MAXSIZE  32767,然后采用语句"(int)(N*rand()/(MAXSIZE+1.0));",这里之所以加上1.0是为了使除法得到的结果是浮点型。

    如果需要得到1~N之间的随机数秩序在上述表达式加一即可,即1+rand()%N或者1+(int)(N*rand()/(MAXSIZE+1.0))。

    

参考来源:

   [1]http://blog.sina.com.cn/s/blog_678c3e390100qndg.html

    [2]http://stackoverflow.com/questions/8049556/what-s-the-difference-between-srand1-and-srand0
 

猜你喜欢

转载自blog.csdn.net/qq_28584889/article/details/83503580
今日推荐