1. 程式人生 > >VS2010中srand和rand產生隨機數的用法

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