发新话题
打印

致开发组:如何正确生成随机数

致开发组:如何正确生成随机数

嘛,最近看到吐槽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 编辑 ]

TOP

看不懂肿么破

TOP

回复 2# PaciFica 的帖子

只要会一点点基础的c语言再加上一点点概率(什么是分布函数,密度函数)知识就行了……

TOP

一点都不懂。。。。。。。。。。。。。

TOP

蒙特卡洛谬误
·苏菲 目标渗漏零烦恼。(等级7开启)

TOP

精品贴!

TOP

总而言之 都是时辰的错

TOP

强化成功概率 肯定算上了充值金额

TOP

晚上刚刚花了260块强化一个47绿腰带到9
前150软妹上了一次8,上9失败
后110软妹上了四次8,最后一次上9成功
连爆掉到+3多次
+8各种连败4次以上
貌似实际成功率远低于图示概率

但是!!也有可能是我长得太丑的缘故

TOP

回复 9# PaciFica 的帖子

最后一点

TOP

那个所谓的随机数也就是个hash数列,不过fox的问题明显不是随机数
大!攻!势!

TOP

FOX:"啊,语死早,其实说明要表达的不是那个意思~~"  
时间就像乳沟.挤一挤还是有的...
大河:“......”

TOP

年轻真好

TOP

发新话题