[問題] white noise

作者: DJWS (...)   2015-05-31 16:33:27
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
作者: suhorng ( )   2015-05-31 17:03:00
m_white --reinterpret_cast--> float; 對照 ieee 754 吧看起來是固定指數, 剩下 random 產生個 random float num
作者: DJWS (...)   2015-05-31 20:05:00
http://www.h-schmidt.net/FloatConverter/IEEE754.html勾一勾之後發現範圍落在2~4之間 所以減3
作者: LPH66 (-6.2598534e+18f)   2015-05-31 23:50:00
這其實就是我很久之前提過的直接取浮點數亂數的方法#1FebL7RA 只是這裡要的範圍是 [-1,1) 所以指數固定為 +1那 bias 127 之後就變成 128 << 23 == 0x40000000這樣就能產生 [2,4) 的均勻隨機浮點數亂數 減 3 得 [-1,1)
作者: Killercat (殺人貓™)   2015-06-01 08:25:00
其實不用那麼麻煩啊 boost.Random有幾乎一樣的實作他利用的是std::mt19937 有興趣可以看一下
作者: DJWS (...)   2015-06-01 09:49:00
@Killercat mt19937顯然比較麻煩 為何你覺得簡單?http://goo.gl/cFgu8c boost src comment提供的連結@LPH66 不過這段程式碼有integer overflow如果mod某數 那麼就不會是uniform distribution了....
作者: Killercat (殺人貓™)   2015-06-01 10:38:00
不是,我的意思是Boost::Random有利用mt19937的實作誒,也許他只能用C...那就當我沒說了囧 剛才想到
作者: Feis (永遠睡不著 @@)   2015-06-01 10:45:00
蠻有趣的. mod 某未定數之後還能 uniform dist 的怎樣的性質
作者: DJWS (...)   2015-06-01 14:36:00
@Feis 我是說他的LCG會溢位 他忘記mod即便他記得mod 也要看他mod什麼 才可能是uniform
作者: Feis (永遠睡不著 @@)   2015-06-01 14:53:00
@DJWS 不曉得您說的是哪個 LCG? 這篇文章的不是 mod 2^32 ?
作者: DJWS (...)   2015-06-02 06:39:00
如果沒有溢位 可以這樣認為 / 如果已經溢位 是未定義行為此例當中 即便他記得補上mod 2^32 依然會溢位我搞錯了 剛剛翻了規格書 發現unsigned int不會溢位如你所說是mod 2^32沒錯 謝謝

Links booklink

Contact Us: admin [ a t ] ucptt.com