嘛,最近看到吐槽Soc概率的人比较多,由于我也是学计算机的,就来说下随机数生成吧。
假象问题:生成一个随机发生器,90%概率为真,其余为假。
学过基础c/c++编程的人应该看得懂下面的代码:
bool ranGen()
{
srand(time(NULL));//初始随机数种子
int num = rand()%100;//生成0-99里的随机数
if(num < 90) return true;
return false;
}
上面的程序乍看下没什么问题,但是大多数情况下会离90%概率为真的要求相差甚远。
要说这段代码的问题所在,除去那些经常讨论的时间相关性,相邻随机数之间的相关性等等外,最重要的一点,是无法保证变量num的概率分布。
重新分析下上面的代码,变量num其实是值域[0,99]上的整形随机变量,上面的函数在num小于90时返回真,如果我们假设num的概率密度函数为n(x),上面的函数返回真的概率应该为sum{i from 0 to 89} n(i)。
但是,我们无法确定num的概率分布!首先,rand()本身是不是[0,RAND_MAX)上的均匀分布这个问题就很难说,再加上RAND_MAX不能被100整除的情况,最终的概率就更值得商榷了。
其实解决方法也很简单,c++就有random库:
http://www.cplusplus.com/reference/random/
支持各种分布函数,当然也有这里我们要的均匀分布。虽然都是根据时间来的伪随机数,但比rand()好多了
当然,也有其他现成可用的随机数生成器,比如这个:
http://www.omnetpp.org/doc/omnet ... domNumbersCont.html
boost库中也有关于随机数的内容:
http://www.boost.org/doc/libs/1_53_0/doc/html/boost_random.html
最后,如果开发组在最初开发时已经意识到了这个问题,就让这贴沉了,权当我在讲废话吧…………
[
本帖最后由 Proton 于 2013-2-9 20:11 编辑 ]