1. 程式人生 > >C++11新特性(75)-隨機數庫(Random Number Library)

C++11新特性(75)-隨機數庫(Random Number Library)

從前的隨機數

C++11之前,無論是C,還是C++都使用相同方式的來生成隨機數,程式碼大致如下:

由於rand()產生的是偽隨機數,所以需要為rand函式提供種子。種子不同產生的隨機數序列也不同。通常的做法是呼叫srand(time(0)),由於time返回的是系統時間,每秒都會不同,所以產生的隨機數相同機率就會變得很小。

這種方式有一個難點,就是不容易控制輸出結果的範圍。特別是希望不是均勻分佈的時候就更難。

 

隨機數庫(Random Number Library)

C++11中提供了隨機數庫,包括隨機數引擎類(random-number engines)和隨機數分佈類(random-number distribution)。二者一般配合使用。

隨機數引擎

標準庫提供了多重隨機數引擎,這裡以default_random_engine類為例進行說明。

到這裡為止,和之前的方式沒有什麼本質區別,只是形式不同。別忙,接著往下看。

 

隨機數分佈類

C++11通過隨機數分佈類來控制隨機數引擎生成的隨機數的分佈情況。

 

生成平均分佈的整數

程式碼中使用uniform_int_distribution<int>來控制隨機數引擎生成0到10之間的整數。

 

生成平均分佈的實數

程式碼中使用uniform_real_distribution來控制隨機數引擎生成0到10之間的實數。

 

生成正態分佈的實數

程式碼中使用normal_distribution<>來控制隨機數引擎生成均值為2,標準差為0.25的正態分佈資料。

 

生成概率可控的布林值

程式碼中使用bernoulli_distribution來控制隨機數引擎生成布林值隨機數,其中1的概率為0.3。

 

輸出結果

作者一句話

如果看一下C++11標準庫,你會發現還有很多種隨機數引擎類和隨機數分佈類。需要的時候去學吧。

 

覺得本文有幫助?請分享給更多人。

閱讀更多更新文章,請掃描下面二維碼,關注微信公眾號【面向物件思考】