附錄 | Bug踩坑----隨機數(shù)引擎

? 在計算隨機運動軌跡的時候,需要用到c++11的隨機數(shù)引擎類(random_number_engines)來產(chǎn)生隨機數(shù)序列,并通過隨機數(shù)分布類(random-number distribution)使用隨機數(shù)引擎生成服從特定概率分布的隨機數(shù)。
? 正常情況下,只需要這樣就可以生成一個服從分布的隨機數(shù):

? 但是,這個隨機數(shù)引擎類有個巨大的坑,即:
default_random_engine類下一次運算結(jié)果依賴于上一次,初次實例化該類的時候,它的值只和time(0)有關(guān)。因此,在同一個實例中,多次使用該類去生成隨機數(shù),每一次的計算結(jié)果依賴于上一次的計算結(jié)果,因此能生成數(shù)值分布較大的隨機數(shù)。
但是,由于它每次實例化只和time(0)有關(guān),所以如果我們在較短時間內(nèi)多次實例化該類,每次都會調(diào)用time(0)重新初始化,且由于time(0)的數(shù)值差別不大,因此 e(time(0)) 的計算結(jié)果是基本相同的,就導(dǎo)致了 m(e) 的值也基本相同。
? 這個特性在需要在一個類中多次調(diào)用另一個類來生成一個隨機數(shù)的時候,會發(fā)生意想不到的BUG:


? 上面這樣使用隨機數(shù)引擎類的結(jié)果是每次的 t 都是差不多的,相差很小,就達不到生成隨機數(shù)的效果了。
? 可以使用 rand()函數(shù)來避免這個BUG,但是注意也是同樣不能設(shè)置隨機種子,不然還是會跟隨機數(shù)引擎類一樣。
標簽: