posts - 1,  comments - 0,  trackbacks - 0
          隨機數與隨機種子      
                調用隨機數函數 rand() 的時候, 實際得到的這個隨機數并不是絕對隨機的,它是以一個初始值,通過一個算法,計算出來的“偽隨機數"數列,每次調用rand()時,從這個數列依次取出一個值,做為隨機數。這個初始的值就是"隨機數種子", 也就是說,如果隨機數種子相同,計算出的隨機數數列是相同的。而srandom( x) 這個函數就是初始化隨機數產生器,設定隨機數種子用的。給定的x的就是隨機數種子。可以驗證,當你多次調用srandm(x)時,如果x取值相同,則得到的隨機數數列是一樣的。所以,若我們每次運行程序時,要得到不同的隨機數序列,就應該用不同的種子來初始化這個隨機數產生器。比如說,用時間初始化它,或者用getpid(),用進程的pid號初始化,由于每次運行程序時,它的pid號一般是不同的,所以能夠產生不同的隨機數序列。

          舉例說明
          在vc++中程序中用了srandom()和random(),頭文件為stdlib.h,但編譯出現錯誤error C3861: “srandom”: 找不到標識符。
            原因是現在vc++編譯器的庫函數中沒有randomize()和random(),分別用srand()和rand()代替了。
            #include <time.h> //定義關于時間的函數  
            一般在用到time(NULL)(當前時間)函數時需要包含此頭文件  
            #include <stdlib.h> //定義雜項函數及內存分配函數  
            一般在用到rand()和srand()函數時需要包含此頭文件  

            函數名: random 功 能: 隨機數發生器,也就是產生一個隨機數  
            用 法: int random(int num);  
            產生的隨機數范圍為0~num-1。  

            函數名: randomize  
            功 能: 初始化隨機數發生器,相當于撥隨機種子  
            用 法: void randomize(void);
           
          1. #include <iostream>  
          2. #include <stdlib.h>    // Need random(), srandom()  
          3. #include <time.h>      // Need time()  
          4. #include <algorithm>   // Need sort(), copy()  
          5. #include <vector>      // Need vector  
          6.   
          7. using namespace std;  
          8.   
          9. void Display(vector<int>& v, const char* s);  
          10.   
          11. int main()  
          12. {  
          13.     // Seed the random number generator  
          14.     srand(time(NULL));  
          15.     // Construct vector and fill with random integer values  
          16.     vector<int> collection(10);  
          17.     for (int i = 0; i < 10; i++)  
          18.         collection[i] = rand() % 10000;  
          19.       
          20.     // Display, sort, and redisplay  
          21.     Display(collection, "Before sorting");  
          22.     sort(collection.begin(), collection.end());  
          23.     Display(collection, "After sorting");  
          24.     return 0;  
          25. }  
          26.   
          27. // Display label s and contents of integer vector v  
          28. void Display(vector<int>& v, const char* s)  
          29. {  
          30.     cout << endl << s << endl;  
          31.     copy(v.begin(), v.end(),ostream_iterator<int>(cout, "\t"));  
          32.     cout << endl;  
          33. }  
          一般情況下可以設置當前時間為種子 srandom((int)time(0));
          需要多次取隨即數時,可以將上次拿到的隨即數作為種子

          posted on 2012-03-29 15:15 憤怒的考拉 閱讀(1219) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿

          隨筆檔案

          文章檔案

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 齐河县| 涞源县| 宿松县| 盐边县| 墨玉县| 瓮安县| 浪卡子县| 祁阳县| 噶尔县| 宜丰县| 正阳县| 张家界市| 老河口市| 共和县| 遵化市| 瑞丽市| 罗江县| 招远市| 天台县| 连云港市| 文安县| 黔东| 青铜峡市| 通江县| 蒙城县| 阿拉善盟| 望谟县| 五大连池市| 桦甸市| 斗六市| 安阳市| 精河县| 鄂伦春自治旗| 东宁县| 昭通市| 阿巴嘎旗| 信阳市| 巴中市| 蓬安县| 饶平县| 大渡口区|