rand 和srand函數的使用

2021-02-19 華清遠見

最近在進行智能倉儲項目的研究時,為了方便A9模塊數據的處理,對於M0模塊通過傳感器的方式採集數據,改成了srand函數和rand函數來模擬數據,這樣方便我把精力更多的放在A9模塊的數據的處理上,提高了工作的效率,下面給大家介紹一下這兩個函數的具體使用:

函數一:int rand(void);

功能:產生隨機值,從srand (seed)中指定的seed開始,返回一個[seed, RAND_MAX(0x7fff))間的隨機整數。

函數二:void srand(unsigned seed);

參數seed是rand()的種子,用來初始化rand()的起始值。

可以認為rand()在每次被調用的時候,它會查看:

1) 如果用戶在此之前調用過srand(seed),給seed指定了一個值,那麼它會自動調用

srand(seed)一次來初始化它的起始值。

2) 如果用戶在此之前沒有調用過srand(seed),它會自動調用srand(1)一次。

根據上面的第一點我們可以得出:

1) 如果希望rand()在每次程序運行時產生的值都不一樣,必須給srand(seed)中的seed一個變值,這個變值必須在每次程序運行時都不一樣(比如到目前為止流逝的時間)。

2) 否則,如果給seed指定的是一個定值,那麼每次程序運行時rand()產生的值都會一樣,雖然這個值會是[seed, RAND_MAX(0x7fff))之間的一個隨機取得的值。

3) 如果在調用rand()之前沒有調用過srand(seed),效果將和調用了srand(1)再調用rand()一樣(1也是一個定值)。

舉幾個例子,假設我們要取得0~6之間的隨機整數(不含6本身):

例一,不指定seed:

for(int i=0;i <10;i++)

{

ran_num=rand() % 6;

cout <

}

每次運行都將輸出:5 5 4 4 5 4 0 0 4 2

例二,指定seed為定值1:

srand(1);

for(int i=0;i <10;i++)

{

ran_num=rand() % 6;

cout <

}

每次運行都將輸出:5 5 4 4 5 4 0 0 4 2

跟例子一的結果完全一樣。

例三,指定seed為定值6:

srand(6);

for(int i=0;i <10;i++)

{

ran_num=rand() % 6;

cout <

}

每次運行都將輸出:4 1 5 1 4 3 4 4 2 2

隨機值也是在[0,6)之間,隨得的值跟srand(1)不同,但是每次運行的結果都相同。

例四,指定seed為當前系統流逝了的時間(單位為秒):time_t time(0):

#include

//…

srand((unsigned)time(0));

for(int i=0;i <10;i++)

{

ran_num=rand() % 6;

cout <

}

第一次運行時輸出: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 <

值約為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。

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

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

double ran_numf=0.0;

srand((unsigned)time(0));

for(int i=0;i <10;i++)

{

ran_numf = rand() / (double)(RAND_MAX);

cout <

}

運行結果為: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的情況,如此類推。 以上不是偽隨機浮點數最好的實現方法,不過可以將就著用用…

以上便是我對此函數的整理,希望能對大家有所幫助!

長按二維碼3秒

與10萬程序高手做朋友

每天乾貨享不停

(記得識別二維碼喲)

 

或微信搜索華清遠見,即可關注我們

免費講座 | 乾貨分享 | 程式設計師生活 | 就業招聘

高端IT就業培訓專家

m.embedu.org

相關焦點

  • 單片機隨機數:rand(),srand()
    seed) 初始化隨機數發生器有討論如下:1.C的函數庫之所以沒有把使用系統時鐘初始化隨機種子這步重要的操作直接放進rand函數的實現中,我覺得至少有三個原因:(1)可以高效產生連續的隨機數,不用每次都初始化;(2)給程式設計師以更高的靈活性,因為可能在要求較高的場合,應該使用更好的的數據做種子,而不是系統時鐘;(3)對於只是想產生大量偽隨機數來盡興某種驗證或者統計
  • 這項excel技能很實用,有關rand函數以及rand函數嵌套的使用技巧
    其實方法也很簡單,我們可以藉助excel強大的函數,快速解決這個問題,這次我們要分享的是rand函數以及rand函數嵌套的具體應用以及使用技巧。下面我們就以視頻結合實例的形式,快速講解一下有關rand函數以及rand函數嵌套的使用技巧,通俗易懂,可以幫你快速將這些函數應用到實際工作中。
  • 【編程基礎】C語言產生隨機數需要了解的幾個函數
    C語言產生隨機數是一個常見的編程功能任務,當然這個也不難,調用兩三個函數就出來了,但是你知道這些函數具體是起到怎樣的作用,並且是它們是如何產生隨機數的嗎?幾個概念隨機數:數學上產生的都是偽隨機數,真正的隨機數使用物理方法產生的。隨機數種子:隨機數的產生是由算術規則產生的,srand(seed)的隨機數種子不同,rand()的隨機數值就不同,倘若每次的隨機數種子一樣,則rand()的值就一樣。
  • excel中隨機函數rand如何使用
    我們在excel中有時候會用到隨機函數,其中rand函數是一個可以生成隨機數的函數,成數範圍是大於等於0小於1,那excel中隨機函數rand如何使用呢?打開excel之後,選擇單元格,在選擇的這個單元格內輸入rand函數。輸入好函數之後,按下回車,就會得到一個隨機的小數。在rand函數的後面乘以一個10。乘以10之後,再次按下回車鍵,可以得到一個大於1的數了(5225012 com)。
  • 隨機生成整數,randbetween函數的具體使用技巧
    我們在實際工作中,我們使用excel處理數據的頻率比較高,我們需要掌握一些excel表格的使用技巧,上次我們一起學習了隨機函數rand的使用技巧,不過有些人覺得rand函數有點複雜,因為我們大部分情況下,希望隨機生成的都是整數,所以這次我們分享另外一個比較實用的excel函數,這個函數就是
  • WPS Excel:巧用隨機函數rand和randbetween生成各種數據
    rand和randbetween函數的本職工作是產生隨機小數和隨機整數。然而,應用巧妙的話,還可以獲取隨機姓名、隨機時間,常見的抽獎神器、點菜神器、選擇困難終結器等都可以用它們來完成。基礎用法這兩個函數都非常簡單,「rand()」沒有參數,返回0到1之間的小數,因此「rand()*100」可以得到0到100之間的小數;randbetween函數有兩個參數,分別是最小值和最大值,使用它可以獲得這兩個值之間的整數。
  • 「Excel技巧」有了隨機函數rand和randbetween函數,想隨機就隨機
    今天要說的是Excel的兩個隨機函數RAND函數和RANDBETWEEN函數。別小看這兩個函數,它們雖是小函數,但有大能量。因為它們為我們隨機錄入批量數據提供了很大方便。語法結構:=RAND()現在看看rand怎麼生成0~1之間的隨機數,如下:現在再看看rand怎麼生成1~10的隨機整數,公式:=ROUND
  • Excel產生隨機數Rand函數巧妙應用
    Excel中產生隨機數的函數有兩個,一個是rand函數,一個是randbetween函數,今天主要介紹rand函數的用法,從入門至精通。
  • 隨機生成數據的幾個小技巧,rand函數的應用
    我們在日常工作中,有時候使用excel表格隨機生成數據,下面我們就分享一下隨機函數rand的使用技巧。rand函數可以生成0-1之間的隨機函數(包含小數位數)。我們大部分人都只使用rand函數的基礎應用,就是在excel單元格內輸入=rand(),然後按enter鍵,即可生成隨機數,按F9鍵可以自動刷新。如果我們覺得0-1之間這個數值不能夠滿足我們的需求,我們也讓他放大使用公式=rand()*100,加上*100也就擴大100倍的隨機數。假如我們需要要給這個隨機函數生成的隨機數指定一個範圍,那我們可以使用=rand()*(B-A)+A。
  • C++常用內置函數
    在 C++ 中,除了可以創建各種函數,還包含了各種有用的函數供您使用。這些函數寫在標準 C 和 C++ 庫中,叫做內置函數。C++ 內置了豐富的數學函數,可對各種數字進行運算。下表列出了 C++ 中一些有用的內置的數學函數。 為了利用這些函數,需要引用數學頭文件。在許多情況下,需要生成隨機數。
  • Word教程:函數RAND在Word中的妙用
    函數RAND是一個生成隨機數的函數,最常見的就是在Excel表中,要模擬一些數據時經常會使用函數RAND來生成隨機數。在excel表中輸入公式=RAND(),按回車鍵後會返回一個0-1之間的隨機小數,注意函數RAND是沒有任何參數的。那在Word文檔中是否也可以使用函數RAND呢?答案當然是肯定的!
  • Linux awk 內置函數詳細介紹(二)
    srand( [Expr] )將 rand 函數的種子值設置為 Expr 參數的值,或如果省略 Expr 參數則使用某天的時間。返回先前的種子值。();fr=int(100*rand());print fr;}'78[chengmo@centos5 ~]$ awk 'BEGIN{srand();fr=int(100*rand());print fr;}'31[chengmo@centos5 ~]$ awk 'BEGIN{srand();fr=int(100*rand());print fr;}'41
  • Word中使用RAND函數有什麼作用?如何自動生成隨機文本?
    我們都知道在Excel中會經常用到RAND函數,它可以生成隨機數,用法可見下文。Excel生成隨機數函數RAND和RANDBETWEEN那麼在Word中也能用RAND函數嗎?一、基本語法基本語法為=rand(段落數,每段句數),注意要在英文狀態下輸入。意思是按照指定的段落數和每段句數生成隨機文本。比如要生成6段文字、每段包含3句話,則輸入=rand(6,3),按下回車,結果如下圖所示。
  • 「RAND」函數(隨機生成數值)和「求和」選項
    背景:在案例教學中經常會用到「RAND」函數,這個函數是指生成大於等於0小於1的均勻分布平均數。延伸的函數有「ROUND」函數、「INT」函數和「RANDBETWEEN」函數。「開始」菜單下的「求和」選項包含「求和、平均值、計數、最大值、最小值」等內容,我們在講解完隨機生成函數後,為大家簡單描述這幾項的使用方法。
  • srand((uint32) TargetInit) 的作用
    在2210的UCOS的應用程式中有如下的函數:void TargetInit(void)本文引用地址:http://www.eepw.com.cn/article/201611/319512.htm{OS_ENTER_CRITICAL