[问题] 乱数生成问题(已修改问题)

楼主: hexjacal (黑麻糬)   2014-08-19 23:28:14
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
Dev C++ 4.9.9.2
问题(Question):
我的想要做游戏模拟来验证数学计算结果,游戏大略结构如下
有五个黑袋子,袋中分别有 21, 22, 23, 24, 25 个球
有五个红袋子,袋中分别有 11, 12, 13, 14, 15 个球
程式结构含有
1. function A (负责额外红袋子的 Bonus)
2. function B (负责算黑袋子的分数)
作者: EdisonX (卡卡兽)   2014-08-20 00:07:00
我不建议你再研究这问题,答案是它的周期约是 21 亿个数,解决它的方法是换一个乱数产生器,若愿意从dev-c++跳出来的话,有其他周期较长,基本上不会让你重复的。
楼主: hexjacal (黑麻糬)   2014-08-20 07:43:00
那请问 Visual C++ 会有比较可行的方案吗? 感谢您。
作者: Leadgen (新竹~)   2014-08-20 08:19:00
只要你用的乱数源的Bit数有限,总有一天会再重复的。
作者: azureblaze (AzureBlaze)   2014-08-20 08:37:00
比较新的编译器能用Mersenne twister
作者: johnjohnlin (嗯?)   2014-08-20 13:47:00
C++11 有比较好用的 random
作者: yvb   2014-08-20 19:27:00
乱数 "分给五个袋子使用" 会 "不均匀"? 是你的实测还是推测?我稍微测一下, 且即使把rand()换成MSVC的实作(#1JLwsGtg推文)不管是一组或分多组, 每球被抽出的计次看来差异不大...^同组内的
作者: EdisonX (卡卡兽)   2014-08-20 21:00:00
google C++11 mt19937,它的周期绝对让你够用.原理如 az~ 大所言,用的是梅森旋转法.
楼主: hexjacal (黑麻糬)   2014-08-20 21:10:00
分组不会影响均匀度,如果袋子的球数差异性很大呢?
作者: azureblaze (AzureBlaze)   2014-08-20 21:14:00
品质好的乱数产生器不会因为分组产生差别会有问题我觉得是程式写法或统计的问题
楼主: hexjacal (黑麻糬)   2014-08-20 21:17:00
我在同张乱数表连取五数下对 21~25 取余数作取球总感觉袋子间取的号码不独立,想分开来取试试看
作者: azureblaze (AzureBlaze)   2014-08-20 21:20:00
"感觉"是什么? 有数据吗? 低样本数看起来有模式很正常
作者: wope (独立黑色色彩)   2014-08-21 22:49:00
如果是要数学上的均匀分布U(0,1) 有标准的演算方法然后设v抽出来的值,取f(v)=(b-a)v+af(v)=U(a,b),这样就有a到b的均匀分布最后 如果要1,2,3,4,5均匀抽样 就设a=0.5,b=5.5,f(v)四舍五入就是标准解如果你要抽的不是uniform,要抽的pdf,g1(v),就先对g1(v)积分得到G1(v),其反函数为G1-1(v)所以抽出值为v=G1-1(U(0,1)),就会是你要的pdf最后在高维度抽样,f(v1,v2,...,vn),做法一样先求出边际pdf f1(v1),f2(v2),...,fn(vn),积分得F1,F2,...,F...,Fn 按照Fn的值取P个分割,所以全域有P^n最后先抽U(0.5,P^n+0.5)决定在哪个分割,在分割内再各变量自己抽,vi=U(Low Bounded ,Up Bounded)这里的Low或Up都是指vi这个分割内的上下界另外,有另一种方法是在v方向做分割在值的方向放机率(想成求期望值),这样就可以得到抽样结果(以pdf表示)以上是之前处理10k个随机变量的心得
楼主: hexjacal (黑麻糬)   2014-08-21 23:49:00
我的问题应该是模拟过程中,给定乱数表带来的毛病,同张表出现的乱数是均匀的,但带出来的游戏结果却不一定均匀,所以造成我模拟的结果与数学推论结果有很大差异
作者: azureblaze (AzureBlaze)   2014-08-22 00:05:00
你没考虑到乱数表是ABC的机率所以乱数要用srand初始化防止每次结果都是A此外样本数越少本来就越容易和期望值差很远
作者: mike0227 (我又小看了那复杂的世界)   2014-08-22 01:13:00
请去找Randomness tests的资料来看你所谓 会造成游戏结果差异的乱数 会有特定的pattern在很多test都不会过的

Links booklink

Contact Us: admin [ a t ] ucptt.com