返回列表 发帖

【数据分析】玩俄罗斯方块缺棍子(I)的概率研究

用Nullpomino生成了几种随机方块产生算法的长度为1000000(1百万)序列。
写了个程序,计算一段区间内没有I的情况数除以总的区间数。
测试了一下几种数据:
bag7: Guideline基准使用的随机方块产生器,旋转系统一般是SRS。注意TGM3中的Ti-SRS使用的依然是roll6。
roll4: TGM1, TGM2, TGM2P使用的随机方块产生器。
roll6: TGM3使用的随机方块产生器。
random: 无记忆随机方块产生器,也就是线性地等概率取随机方块。
test: 是长度为7的一个测试文件,来确定计算没有错误。内容是:
  1. ITOSZJL
复制代码

测试的结果是:
  1. importing file bag7.txt, length=1000000
  2. length 1, psb of no-I:          857143/ 1000000        =0.8571430000000
  3. length 2, psb of no-I:          717157/  999999        =0.7171577171577
  4. length 3, psb of no-I:          582880/  999998        =0.5828811657623
  5. length 4, psb of no-I:          457305/  999997        =0.4573063719191
  6. length 5, psb of no-I:          343392/  999996        =0.3433933735735
  7. length 6, psb of no-I:          244231/  999995        =0.2442322211611
  8. length 7, psb of no-I:          162762/  999994        =0.1627629765779
  9. length 8, psb of no-I:          101634/  999993        =0.1016347114430
  10. length 9, psb of no-I:           57921/  999992        =0.0579214633717
  11. length 10, psb of no-I:           28973/  999991        =0.0289732607593
  12. length 11, psb of no-I:           11666/  999990        =0.0116661166612
  13. length 12, psb of no-I:            2889/  999989        =0.0028890317793
  14. length 13, psb of no-I:               0/  999988        =0.0000000000000
  15. length 14, psb of no-I:               0/  999987        =0.0000000000000
  16. length 15, psb of no-I:               0/  999986        =0.0000000000000
  17. length 16, psb of no-I:               0/  999985        =0.0000000000000
  18. length 17, psb of no-I:               0/  999984        =0.0000000000000
  19. length 18, psb of no-I:               0/  999983        =0.0000000000000
  20. length 19, psb of no-I:               0/  999982        =0.0000000000000
  21. length 20, psb of no-I:               0/  999981        =0.0000000000000
  22. ---

  23. importing file roll4.txt, length=1000000
  24. length 1, psb of no-I:          856904/ 1000000        =0.8569040000000
  25. length 2, psb of no-I:          717339/  999999        =0.7173397173397
  26. length 3, psb of no-I:          581314/  999998        =0.5813151626303
  27. length 4, psb of no-I:          448661/  999997        =0.4486623459870
  28. length 5, psb of no-I:          319328/  999996        =0.3193292773171
  29. length 6, psb of no-I:          227508/  999995        =0.2275091375457
  30. length 7, psb of no-I:          162205/  999994        =0.1622059732358
  31. length 8, psb of no-I:          115648/  999993        =0.1156488095417
  32. length 9, psb of no-I:           82431/  999992        =0.0824316594533
  33. length 10, psb of no-I:           58782/  999991        =0.0587825290428
  34. length 11, psb of no-I:           41930/  999990        =0.0419304193042
  35. length 12, psb of no-I:           29882/  999989        =0.0298823287056
  36. length 13, psb of no-I:           21299/  999988        =0.0212992555911
  37. length 14, psb of no-I:           15232/  999987        =0.0152321980186
  38. length 15, psb of no-I:           10907/  999986        =0.0109071527001
  39. length 16, psb of no-I:            7805/  999985        =0.0078051170768
  40. length 17, psb of no-I:            5548/  999984        =0.0055480887694
  41. length 18, psb of no-I:            3969/  999983        =0.0039690674741
  42. length 19, psb of no-I:            2829/  999982        =0.0028290509229
  43. length 20, psb of no-I:            2001/  999981        =0.0020010380197
  44. ---

  45. importing file roll6.txt, length=1000000
  46. length 1, psb of no-I:          857040/ 1000000        =0.8570400000000
  47. length 2, psb of no-I:          715278/  999999        =0.7152787152787
  48. length 3, psb of no-I:          574777/  999998        =0.5747781495563
  49. length 4, psb of no-I:          435467/  999997        =0.4354683064049
  50. length 5, psb of no-I:          297309/  999996        =0.2973101892408
  51. length 6, psb of no-I:          203058/  999995        =0.2030590152951
  52. length 7, psb of no-I:          138798/  999994        =0.1387988327930
  53. length 8, psb of no-I:           94911/  999993        =0.0949116643817
  54. length 9, psb of no-I:           64935/  999992        =0.0649355194842
  55. length 10, psb of no-I:           44467/  999991        =0.0444674002066
  56. length 11, psb of no-I:           30402/  999990        =0.0304023040230
  57. length 12, psb of no-I:           20830/  999989        =0.0208302291325
  58. length 13, psb of no-I:           14266/  999988        =0.0142661711941
  59. length 14, psb of no-I:            9737/  999987        =0.0097371265826
  60. length 15, psb of no-I:            6620/  999986        =0.0066200926813
  61. length 16, psb of no-I:            4487/  999985        =0.0044870673060
  62. length 17, psb of no-I:            3054/  999984        =0.0030540488648
  63. length 18, psb of no-I:            2041/  999983        =0.0020410346976
  64. length 19, psb of no-I:            1380/  999982        =0.0013800248404
  65. length 20, psb of no-I:             933/  999981        =0.0009330177273
  66. ---

  67. importing file random.txt, length=1000000
  68. length 1, psb of no-I:          857010/ 1000000        =0.8570100000000
  69. length 2, psb of no-I:          734544/  999999        =0.7345447345447
  70. length 3, psb of no-I:          629579/  999998        =0.6295802591605
  71. length 4, psb of no-I:          539564/  999997        =0.5395656186969
  72. length 5, psb of no-I:          462392/  999996        =0.4623938495754
  73. length 6, psb of no-I:          396304/  999995        =0.3963059815299
  74. length 7, psb of no-I:          339588/  999994        =0.3395900375402
  75. length 8, psb of no-I:          290940/  999993        =0.2909420365943
  76. length 9, psb of no-I:          249266/  999992        =0.2492679941440
  77. length 10, psb of no-I:          213529/  999991        =0.2135309217783
  78. length 11, psb of no-I:          182815/  999990        =0.1828168281683
  79. length 12, psb of no-I:          156550/  999989        =0.1565517220689
  80. length 13, psb of no-I:          134076/  999988        =0.1340776089313
  81. length 14, psb of no-I:          114790/  999987        =0.1147914922894
  82. length 15, psb of no-I:           98294/  999986        =0.0982953761353
  83. length 16, psb of no-I:           84212/  999985        =0.0842132631989
  84. length 17, psb of no-I:           72141/  999984        =0.0721421542745
  85. length 18, psb of no-I:           61777/  999983        =0.0617780502269
  86. length 19, psb of no-I:           52909/  999982        =0.0529099523791
  87. length 20, psb of no-I:           45335/  999981        =0.0453358613814
  88. ---

  89. importing file test.txt, length=7
  90. length 1, psb of no-I:               6/       7        =0.8571428571429
  91. length 2, psb of no-I:               5/       6        =0.8333333333333
  92. length 3, psb of no-I:               4/       5        =0.8000000000000
  93. length 4, psb of no-I:               3/       4        =0.7500000000000
  94. length 5, psb of no-I:               2/       3        =0.6666666666667
  95. length 6, psb of no-I:               1/       2        =0.5000000000000
  96. length 7, psb of no-I:               0/       1        =0.0000000000000
  97. ---

  98. finished: 5 files
复制代码

概率变化折线图表:

注意概率轴使用的是对数。
bag7随机方块产生器理论上就决定了,最多存在长度为12的没有I的区间。所以到13就是0了,在对数图上是无穷低。
长度为1的就代表I总的出现频率。
在长度为2的时候区别不明显,random高2%。
3开始全随机就明显比另三个都要高了,并且到14个方块的时候还保持在11%上,也就是11%的可能性连续14个方块里面没有一个I。
roll4和6两种,后者较前者略低。
bag7在3到6上似乎还比roll4和6上高。到了极限长度12上,可能性约为roll4的十分之一,roll6的七分之一。
差不多就是这样……

程序代码?
  1. #include <cstdio>
  2. #include <cstdlib>
  3. const int maxlen=1048576,maxrng=20;
  4. const char * files[]={
  5.         "bag7.txt",
  6.         "roll4.txt",
  7.         "roll6.txt",
  8.         "random.txt",
  9.         "test.txt"
  10. };
  11. const int filec=5;
  12. int apptbl[256]={0};
  13. bool acptbl[256]={0};
  14. int seqlen;
  15. unsigned char seq[maxlen],inchar;
  16. int pfxsum[maxlen]={0};
  17. FILE *fi;

  18. void init()
  19. {
  20.         acptbl['I']=true;
  21.         acptbl['T']=true;
  22.         acptbl['O']=true;
  23.         acptbl['S']=true;
  24.         acptbl['Z']=true;
  25.         acptbl['J']=true;
  26.         acptbl['L']=true;
  27.         //use file instead of stdout
  28.         freopen("result.txt","w",stdout);
  29. }
  30. int main()
  31. {
  32.         init();
  33.         for(int xhf=0;xhf<filec;xhf++)
  34.         {
  35.                 fi=fopen(files[xhf],"r");
  36.                 seqlen=0;
  37.                 //import seq from txt
  38.                 while(true)
  39.                 {
  40.                         fscanf(fi,"%c",&inchar);
  41.                         if(feof(fi))
  42.                                 break;
  43.                         apptbl[inchar]++;
  44.                         if(acptbl[inchar])
  45.                         {
  46.                                 seq[seqlen++]=inchar;
  47.                         }
  48.                 }
  49.                 printf("importing file %s, length=%d\n",files[xhf],seqlen);
  50.                 //sum of chars?
  51.                 for(int xh=0;xh<256;xh++)
  52.                 {
  53.                         if(apptbl[xh]!=0)
  54.                                 //printf("char %d appears %d\n",xh,apptbl[xh]);
  55.                         apptbl[xh]=0;
  56.                 }
  57.                 //build prefix sum for 'I'
  58.                 for(int xhp=0;xhp<seqlen;xhp++)
  59.                 {
  60.                         pfxsum[xhp+1]=pfxsum[xhp];
  61.                         if(seq[xhp]=='I')
  62.                                 pfxsum[xhp+1]+=1;
  63.                 }
  64.                 //for lengths of range
  65.                 for(int xhl=1;xhl<=maxrng;xhl++)
  66.                 {
  67.                         if(xhl>seqlen)
  68.                                 break;
  69.                         int noi=0,br=seqlen-xhl+1;
  70.                         for(int xho=0;xho<br;xho++)
  71.                                 if(pfxsum[xho+xhl]==pfxsum[xho])
  72.                                         noi++;
  73.                         printf("length %d, psb of no-I:\t%8d/%8d\t=%.13f\n",xhl,noi,br,double(noi)/double(br));
  74.                         //printf("%.13f\n",double(noi)/double(br));
  75.                 }
  76.                 //finish
  77.                 printf("---\n\n");
  78.                 fclose(fi);
  79.         }
  80.         printf("finished: %d files\n",filec);
  81.         //system("pause");
  82.         return 0;
  83. }
复制代码

就不要吐槽这翔一样的代码了……

返回列表