[问题] 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