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標準庫,你會發現還有很多種隨機數引擎類和隨機數分佈類。需要的時候去學吧。
覺得本文有幫助?請分享給更多人。
閱讀更多更新文章,請掃描下面二維碼,關注微信公眾號【面向物件思考】