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