隨機種子關於rand和srand函數使用的一點心得


每日一貼,今天的內容關鍵字為隨機種子

         在c語言里面,兩個函數包括在<stdlib.h>頭文件里面,c++里面,標准庫<cstdlib>(被包括於<iostream>中).

      srand函數是隨機數發生器的初始化函數。

            原型:void srand(unsigned seed);

            rand函數用來發生隨機數,當然是偽隨機數

           原型:int rand(void)

           seed的作用:srand函數的作用是根據參數seed,設置一個隨機起始點,而rand函數根據這個起始點,發生隨機數序列。默認的隨機種子為1。如果隨機種子一樣,rand函數所發生的隨機序列也一樣。
       
因此,為使每次程序運行都能發生不同的隨機序列,每次都應發生一個不同的種子參數

    

           說明

           因為rand的內部實現是用線性同余法做的,它不是真的隨機數,只不過是因為其周期特別長,所以有一定的范圍里可看成是隨機的,rand()會返回一隨機數值,范圍在0至RAND_MAX 間。在調用此函數發生隨機數前,必須先利用srand()設好隨機數種子,如果未設隨機數種子,rand()在調用時會主動設隨機數種子為1。rand()發生的是假隨機數字,每次執行時是雷同的。若要不同,以不同的值來初始化它.初始化的函數就是srand()

          返回值:
      返回0至RAND_MAX之間的隨機整數值,RAND_MAX的范圍起碼是在32767之間(int),即雙字節(16位數)。若用unsigned int 雙字節是65535,四字節是4294967295的整數范圍。

       0~RAND_MAX每一個數字被選中的機率是雷同的。

           運用示例

    

//取得0~6之間的隨機整數
#include <iostream>

int main()
{
	for(int i=0;i<10;i++)
    { 
		ran_num=rand()%6;
		cout<<ran_num<<" ";
	}
	return 0;
}
//由於種子默認都是1,故每次運行都將輸出:5 5 4 4 5 4 0 0 4 2

    

     指定seed為定值1時:

    

//取得0~6之間的隨機整數
#include <iostream>

int main()
{
    srand(1);
	for(int i=0;i<10;i++)
    { 
		ran_num=rand()%6;
		cout<<ran_num<<" ";
	}
	return 0;
}
//由於種子沒變更,每次運行都將輸出:5 5 4 4 5 4 0 0 4 2

    指定seed為定值6:

    

    每日一道理
風,那么輕柔,帶動着小樹、小草一起翩翩起舞,當一陣清風飄來,如同母親的手輕輕撫摸自己的臉龐,我喜歡那種感覺,帶有絲絲涼意,讓人心曠神怡。享受生活,不一定要有山珍海味、菱羅綢緞為伴,大自然便是上帝所賜予人類最為珍貴的。
//取得0~6之間的隨機整數
#include <iostream>

int main()
{
    srand(6);
	for(int i=0;i<10;i++)
    { 
		ran_num=rand()%6;
		cout<<ran_num<<" ";
	}
	return 0;
}
//由於種子沒變更,每次運行都將輸出:每次運行都將輸出:4 1 5 1 4 3 4 4 2 2

     那么我們如何發生一個偽隨機的種子呢?一般指定seed為當前系統流逝了的時光(單位為秒):time_t time(0):

    

//取得0~6之間的隨機整數
#include <iostream>
#include <ctime>//時光函數

int main()
{
    srand((unsigned)time(0));
	for(int i=0;i<10;i++)
    { 
		ran_num=rand()%6;
		cout<<ran_num<<" ";
	}
	return 0;
}

            

    第一次運行時輸出:0 1 5 4 5 0 2 3 4 2

           第二次:3 2 3 0 3 5 5 2 2 3
       總之,每次運行結果將不一樣,因為每次啟動程序的時辰都不同(距離須大於1秒?見下)。 

           關於time_t time(0): 
       time_t被定義為長整型,它返回從1970年1月1日零時零分零秒到目前為止所經過的時光,單位為秒。比如假設輸出:
       cout<<time(0);
      值約為1169174701,約等於37(年)乘365(天)乘24(小時)乘3600(秒)(月日沒算)。 

    
      另外,關於ran_num = rand() % 6,將rand()的返回值與6求模是必須的,這樣才能確保目的隨機數落在[0,6)之間,否則rand()的返回值本身多是很偉大的。
      一個通用的公式是:
      要取得[a,b)之間的隨機整數,使用(rand() % (b-a))+ a (結果值將含a不含b)。在a為0的情況下,簡寫為rand() % b。 

          另外還有一種比較常用的發生隨機種子的函數:

           srand(time(NULL)); //是以當前時光為種子,發生隨意數。其中,time(NULL)用來獲得當前時光,本質上失掉的是一個大整數,然后用這個數來隨機數。

    
      最后,關於偽隨機浮點數: 

          用rand() / double(RAND_MAX)可以取得0~1之間的浮點數(注意,不同於整型時候的公式,是除以,不是求模),舉例:

    

    

#include <iostream>
#include <ctime>//時光函數

int main()
{
    double ran_numf=0.0;
    srand((unsigned)time(0));
    for(int i=0;i<10;i++)
	{ 
		ran_numf = rand() / (double)(RAND_MAX);
		cout<<ran_numf<<" ";
	}

	return 0;
}

           

    運行結果為:0.716636,0.457725,…等10個0~1之間的浮點數,每次結果都不同。

           如果想取更大范圍的隨機浮點數,比如1~10,可以將rand() /(double)(RAND_MAX) 改為rand() /(double)(RAND_MAX/10)
       運行結果為:7.19362,6.45775,…等10個1~10之間的浮點數,每次結果都不同。
至於100,1000的情況,如此類推。 
       以上不是偽隨機浮點數最好的實現方法,不過可以將就着用用…

    

文章結束給大家分享下程序員的一些笑話語錄: 程序員的願望
  有一天一個程序員見到了上帝.上帝: 小伙子,我可以滿足你一個願望.程序員: 我希望中國國家隊能再次打進世界杯.
  上帝: 這個啊!這個不好辦啊,你還說下一個吧!
  程序員: 那好!我的下一個願望是每天都能休息6個小時以上.
  上帝: 還是讓中國國家打進世界杯.

--------------------------------- 原創文章 By 隨機和種子 ---------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM