看板 C_and_CPP 關於我們 聯絡資訊
http://vellocet.com/dsp/noise/VRand.h inline float white(float scale=0.5f) { m_seed = (m_seed * 196314165) + 907633515; m_white = m_seed >> 9; m_white |= 0x40000000; return ((*(float*)&m_white)-3.0f)*scale; }; 想請教這段程式碼在做什麼? 我只知道第一行是在做 Linear Congruential Generator -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.250.78.57 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1433061212.A.CBA.html
suhorng: m_white --reinterpret_cast--> float; 對照 ieee 754 吧 05/31 17:03
suhorng: 看起來是固定指數, 剩下 random 產生個 random float num 05/31 17:04
DJWS: 勾一勾之後發現範圍落在2~4之間 所以減3 05/31 20:08
LPH66: 這其實就是我很久之前提過的直接取浮點數亂數的方法 05/31 23:50
LPH66: #1FebL7RA 只是這裡要的範圍是 [-1,1) 所以指數固定為 +1 05/31 23:51
LPH66: 那 bias 127 之後就變成 128 << 23 == 0x40000000 05/31 23:51
LPH66: 這樣就能產生 [2,4) 的均勻隨機浮點數亂數 減 3 得 [-1,1) 05/31 23:53
Killercat: 其實不用那麼麻煩啊 boost.Random有幾乎一樣的實作 06/01 08:25
Killercat: 他利用的是std::mt19937 有興趣可以看一下 06/01 08:26
DJWS: @Killercat mt19937顯然比較麻煩 為何你覺得簡單? 06/01 09:49
DJWS: http://goo.gl/cFgu8c boost src comment提供的連結 06/01 09:51
DJWS: @LPH66 不過這段程式碼有integer overflow 06/01 09:57
DJWS: 如果mod某數 那麼就不會是uniform distribution了.... 06/01 09:58
Killercat: 不是,我的意思是Boost::Random有利用mt19937的實作 06/01 10:38
Killercat: 誒,也許他只能用C...那就當我沒說了囧 剛才想到 06/01 10:39
Feis: 蠻有趣的. mod 某未定數之後還能 uniform dist 的怎樣的性質 06/01 10:45
DJWS: @Feis 我是說他的LCG會溢位 他忘記mod 06/01 14:36
DJWS: 即便他記得mod 也要看他mod什麼 才可能是uniform 06/01 14:39
Feis: @DJWS 不曉得您說的是哪個 LCG? 這篇文章的不是 mod 2^32 ? 06/01 14:53
DJWS: 如果沒有溢位 可以這樣認為 / 如果已經溢位 是未定義行為 06/02 06:39
DJWS: 此例當中 即便他記得補上mod 2^32 依然會溢位 06/02 06:41
DJWS: 我搞錯了 剛剛翻了規格書 發現unsigned int不會溢位 06/02 07:24
DJWS: 如你所說是mod 2^32沒錯 謝謝 06/02 07:25