隨機數生成

2021-07-13 10:28:18 字數 2132 閱讀 6461

c++ api:

c++11往庫里加了不少良心設施,新版的隨機數發生器就是其中之一。

之所以需要全新的隨機數設施想必是因為原來的太難用。

事實呢?嗯,舊的設施真的很難用。

舊式的隨機數發生器沿用c的rand()函式,這個函式會產生區間在\([0, \text]\)的偽隨機數,且隨機數近似可以看做符合均勻分布。

傳統做法的弊端大致有兩個:

經常需要做人肉變換隨機數產生區間,且人肉變換過程中極易破壞原有的分布性質

難以產生符合制定分布的隨機數

相比下,新設施針對這兩點做了很大的改進。

新設施利用兩部分來生成隨機數:

stl預先指定了一系列的生成引擎,並且提供乙個default_random_enginedefault_random_engine會使用某個預定義的引擎,且不同編譯器,不同平台的實現可能不同。

ps:有關詳細的預定義引擎列表,可以參見 這裡

下面是乙個使用預設引擎的例項:

1

2

3

4

5

std :: default_random_engine e ;

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

預設情況下,引擎產生的隨機數範圍在default_randm_engine::mindefault_random_engine::max之間。

有了引擎,我們可以指定隨機數要符合的分布性質,例如說,在\([5,20]\)上的均勻分布

1

2

3

4

5

std :: default_random_engine e ;

std :: uniform_int_distribution <> u ( 5 , 20 ) ;

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

因為我們是利用引擎在制定分布上產生隨機數,所以這裡我們要將引擎物件傳入給分布物件。

庫提供了相當完善的概率分布類,詳細的列表可以參見上面那個url。

由於目前使用的偽隨機數都是根據乙個起始數(通稱為種子)來得到乙個週期很大的數列,所以保證每次使用隨機數時初始化的種子不同對隨機數的質量有很重要的作用。

傳統做法是利用time(null)去初始化種子,這個做法在這裡也可以繼續使用:

1

2

3

std :: default_random_engine e ( time ( nullptr ) ) ;

std :: uniform_int_distribution <> u ( 5 , 20 ) ;

}

不過,由於time的精度是秒,所以在某些極端情況下,這也並不是乙個非常好的選擇。

幸運的,c++11提供了乙個非常友好的類:random_device。這個類的作用是,可以產生non-deterministic random numbers.

這個類有可能產生真正的隨機數,不過真是效果和具體實現有關。某些平台可能才用偽隨機數作為底層實現也說不定呢…

顯然的,我們可以利用random_device去初始化我們的隨機數種子   

1

2

3

4

5

6

std :: random_device rd ;

std :: default_random_engine e ( rd ( ) ) ;

std :: uniform_int_distribution <> u ( 5 , 20 ) ;

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



隨機生成隨機數

現畫乙個command命令按鈕,進行貼上。private sub command1 click show me scale 0,0 18,8 me.auto redraw true me.draw mode 2 circle 3,4 3,vb red me.auto redraw false lin...

隨機數生成

原型 void srand unsigned seed 用法 srand和rand 配合使用產生偽隨機數序列。rand函式在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次呼叫rand函式生成的偽隨機數序列都是一樣的。sr...

生成隨機數

1 生成num位數驗證碼 用於簡訊驗證功能 public static random rand new random public static string getcode int num result,s k return result random r new random 建立乙個隨機數生成...