标题:
致开发组:如何正确生成随机数
[打印本页]
作者:
Proton
时间:
2013-2-9 17:14
标题:
致开发组:如何正确生成随机数
嘛,最近看到吐槽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 编辑
]
作者:
PaciFica
时间:
2013-2-9 17:32
看不懂肿么破
作者:
Proton
时间:
2013-2-9 17:35
标题:
回复 2# PaciFica 的帖子
只要会一点点基础的c语言再加上一点点概率(什么是分布函数,密度函数)知识就行了……
作者:
密涅瓦
时间:
2013-2-9 17:57
一点都不懂。。。。。。。。。。。。。
作者:
Eucharis
时间:
2013-2-9 19:23
蒙特卡洛谬误
作者:
琴乃悠理
时间:
2013-2-9 19:53
精品贴!
作者:
我也没看
时间:
2013-2-9 20:32
总而言之 都是时辰的错
作者:
超微葛炮
时间:
2013-2-9 23:55
强化成功概率 肯定算上了充值金额
作者:
PaciFica
时间:
2013-2-10 00:01
晚上刚刚花了260块强化一个47绿腰带到9
前150软妹上了一次8,上9失败
后110软妹上了四次8,最后一次上9成功
连爆掉到+3多次
+8各种连败4次以上
貌似实际成功率远低于图示概率
但是!!也有可能是我长得太丑的缘故
作者:
Eureka
时间:
2013-2-10 00:02
标题:
回复 9# PaciFica 的帖子
最后一点
作者:
姬宫千歌音
时间:
2013-2-10 01:09
那个所谓的随机数也就是个hash数列,不过fox的问题明显不是随机数
作者:
幽玉
时间:
2013-2-10 03:06
FOX:"啊,语死早,其实说明要表达的不是那个意思~~"
作者:
sundae
时间:
2013-2-10 03:32
年轻真好
欢迎光临 XYZ-SOFT (http://bbs.xyz-soft.com/)
Powered by Discuz! 6.0.0