[問題] white noise

看板C_and_CPP (C/C++)作者 (...)時間10年前 (2015/05/31 16:33), 編輯推噓3(3021)
留言24則, 5人參與, 最新討論串2/2 (看更多)
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

05/31 17:03, , 1F
m_white --reinterpret_cast--> float; 對照 ieee 754 吧
05/31 17:03, 1F

05/31 17:04, , 2F
看起來是固定指數, 剩下 random 產生個 random float num
05/31 17:04, 2F

05/31 20:08, , 4F
勾一勾之後發現範圍落在2~4之間 所以減3
05/31 20:08, 4F

05/31 23:50, , 5F
這其實就是我很久之前提過的直接取浮點數亂數的方法
05/31 23:50, 5F

05/31 23:51, , 6F
#1FebL7RA 只是這裡要的範圍是 [-1,1) 所以指數固定為 +1
05/31 23:51, 6F

05/31 23:51, , 7F
那 bias 127 之後就變成 128 << 23 == 0x40000000
05/31 23:51, 7F

05/31 23:53, , 8F
這樣就能產生 [2,4) 的均勻隨機浮點數亂數 減 3 得 [-1,1)
05/31 23:53, 8F

06/01 08:25, , 9F
其實不用那麼麻煩啊 boost.Random有幾乎一樣的實作
06/01 08:25, 9F

06/01 08:26, , 10F
他利用的是std::mt19937 有興趣可以看一下
06/01 08:26, 10F

06/01 09:49, , 11F
@Killercat mt19937顯然比較麻煩 為何你覺得簡單?
06/01 09:49, 11F

06/01 09:51, , 12F
http://goo.gl/cFgu8c boost src comment提供的連結
06/01 09:51, 12F

06/01 09:57, , 13F
@LPH66 不過這段程式碼有integer overflow
06/01 09:57, 13F

06/01 09:58, , 14F
如果mod某數 那麼就不會是uniform distribution了....
06/01 09:58, 14F

06/01 10:38, , 15F
不是,我的意思是Boost::Random有利用mt19937的實作
06/01 10:38, 15F

06/01 10:39, , 16F
誒,也許他只能用C...那就當我沒說了囧 剛才想到
06/01 10:39, 16F

06/01 10:45, , 17F
蠻有趣的. mod 某未定數之後還能 uniform dist 的怎樣的性質
06/01 10:45, 17F

06/01 14:36, , 18F
@Feis 我是說他的LCG會溢位 他忘記mod
06/01 14:36, 18F

06/01 14:39, , 19F
即便他記得mod 也要看他mod什麼 才可能是uniform
06/01 14:39, 19F

06/01 14:53, , 20F
@DJWS 不曉得您說的是哪個 LCG? 這篇文章的不是 mod 2^32 ?
06/01 14:53, 20F

06/02 06:39, , 21F
如果沒有溢位 可以這樣認為 / 如果已經溢位 是未定義行為
06/02 06:39, 21F

06/02 06:41, , 22F
此例當中 即便他記得補上mod 2^32 依然會溢位
06/02 06:41, 22F

06/02 07:24, , 23F
我搞錯了 剛剛翻了規格書 發現unsigned int不會溢位
06/02 07:24, 23F

06/02 07:25, , 24F
如你所說是mod 2^32沒錯 謝謝
06/02 07:25, 24F
文章代碼(AID): #1LQiTSow (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1LQiTSow (C_and_CPP)