程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> srand((unsigned)time(NULL))以及rand()函數的使用及理解,srandrand

srand((unsigned)time(NULL))以及rand()函數的使用及理解,srandrand

編輯:關於C語言

srand((unsigned)time(NULL))以及rand()函數的使用及理解,srandrand


1.首先說說rand()函數

    rand()函數相當於一個隨機數字生成器,生成數字的大小范圍是0-32767(先前沒有調用srand(seed))。

    那麼為什麼范圍會是0-32767呢?

    0:在使用rand()函數之前沒有調用srand(seed),則系統會默認調用srand(0),而srand(seed)函數中的seed可以理解為隨機數的最小值。

    32767:這個數值大小換為十六進制即為0x7fff,這個數被定義在<stdlib.h>這個頭文件中,定義宏:#define RAND_MAX 0x7fff。

                就是說rand()隨機值得最大值被固定為32767(注意:這個數不是2^16-1,不是65536,不是二個字節能表示的最大值)

                也就是說使用rand()函數必須包含頭文件<stdlib.h>.

 

2.再來說說srand(seed);

    srand(seed)相當於是rand()使用前的聲明,當然你不聲明系統會默認給你聲明,seed就是生成隨機數的最小值。

   下面是一段實例代碼:

   

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main()
 5 {
 6     int a[10],i = 0;
 7     srand(0);
 8     for(;i < 10;i++)
 9     {
10         a[i] = rand();
11         printf("%d,",a[i]);
12     }
13 }   

 

    這是運行結果:

   產生是全是0-32767之間的數。。。。。。

 

   不過這樣使用這個函數從嚴格意義上來說不是隨機的,只是在某種規則下隨機。

   例如我第二次在運行此函數:

   

   你會發現每次運行數組得到的值完全一樣,只是數組內的數值隨機了。

   如果你確定一個seed值,比如上面代碼中的0,你每次運行程序的隨機值會一模一樣,即我第二次運行上述程序,得到的隨機值會和第一次運行得到的隨機值一摸一樣。

   那如何做到真正的獲取隨機值呢?那麼就必須每次運行程序的srand(seed)中的seed值不同,那麼得到的數組值也就不同,也就實現了真正的隨機數。

   這個就要用到time這個函數了。

 

3.聲明srand((unsigned)time(NULL))來實現真正的隨機 

    首先time()函數是用來獲取從1970年1月1日零時零分零秒到目前為止所經過的時間,單位為秒,包含在頭文件<time.h>中

    因為時間是不斷流逝的,所以使用這個函數來當做seed的值,那麼每次seed的值不同,rand()也就是真正的隨機了。

    因為我們不需要參數來記錄傳遞值,所以一般使用time(NULL),並且強制轉化為unsigned類型。

    也就成了srand((unsigned)time(NULL)).......................

    將上面的代碼中srand(0)改為srand((unsigned)time(NULL)),並加上頭文件<time.h>則程序運行的結果如下:

    第一次:

    

    第二次:

    

    這樣我們每次運行得到的就是不同的值了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved