半肾
精华
|
战斗力 鹅
|
回帖 0
注册时间 2014-2-27
|
因为私信怕有字数限制啥的蛮麻烦就直接回在这帖里了
LZ要的最大8D6 重骰5次的方案B的表 等同于8楼那个表的扩展
E:3.500000/D:2.916667 E:4.472222/D:1.971451 E:4.958333/D:1.308449 E:5.244599/D:0.910079 E:5.430941/D:0.659326 E:5.560292/D:0.492850
E:7.000000/D:5.833333 E:8.458333/D:4.905671 E:9.344136/D:3.773546 E:9.930170/D:2.914234 E:10.344479/D:2.288613 E:10.651460/D:1.827833
E:10.500000/D:8.750000 E:12.244599/D:8.104523 E:13.430170/D:6.778046 E:14.273791/D:5.586818 E:14.902756/D:4.624624 E:15.388805/D:3.860632
E:14.000000/D:11.666667 E:15.930941/D:11.362129 E:17.344479/D:10.016237 E:18.402756/D:8.626289 E:19.222277/D:7.407950 E:19.875062/D:6.380374
E:17.500000/D:14.583333 E:19.560292/D:14.615149 E:21.151460/D:13.350342 E:22.388805/D:11.863961 E:23.375062/D:10.469903 E:24.179310/D:9.233598
E:21.000000/D:17.500000 E:23.154117/D:17.844043 E:24.886813/D:16.716255 E:26.274812/D:15.204926 E:27.406675/D:13.702282 E:28.347241/D:12.312309
E:24.500000/D:20.416667 E:26.724354/D:21.044089 E:28.571949/D:20.083840 E:30.088016/D:18.595534 E:31.347410/D:17.035640 E:32.410309/D:15.540219
E:28.000000/D:23.333333 E:30.278177/D:24.215711 E:32.220495/D:23.439162 E:33.846563/D:22.005679 E:35.218241/D:20.425908 E:36.390983/D:18.864474
这次用的PYTHON算的 因为好优化算法
速度挺快的 应该附近数值内的参数调整都能算
方差上和8楼那个表存在微妙的差异 应该是浮点精度的问题
下面是代码 PYTHON相对还是比较普及 LZ可以拿去自己改改参数算需要的
- class stat_table(object):
-
- def __init__(self):
- self._tab = {}
- self.total_prob = 0
- self.expected = None
- self.variance = None
- def insert(self, mainv, extrav, prob):
- if not mainv in self._tab:
- self._tab[mainv] = {}
- if not extrav in self._tab[mainv]:
- self._tab[mainv][extrav] = 0
- self._tab[mainv][extrav] += prob
- self.total_prob += prob
- def each(self):
- for mainv in self._tab:
- for extrav in self._tab[mainv]:
- yield mainv, extrav, self._tab[mainv][extrav]
- def add(self, tab2, val_hndl):
- ntab = type(self)()
- for smv, sev, sp in self.each():
- for dmv, dev, dp in tab2.each():
- nmv, nev = val_hndl(smv, dmv, sev, dev)
- np = sp * dp
- ntab.insert(nmv, nev, np)
- return ntab
- def check_total_prob(self):
- return abs(self.total_prob - 1.) < 1e-6
- def calc_expected(self):
- assert self.check_total_prob()
- self.expected = 0
- for mv, ev, p in self.each():
- self.expected += mv * p
- return self.expected
- def calc_variance(self):
- assert self.check_total_prob()
- assert not self.expected == None
- self.variance = 0
- for mv, ev, p in self.each():
- self.variance += pow(mv - self.expected, 2) * p
- return self.variance
- class dice(stat_table):
-
- def __init__(self):
- super(dice, self).__init__()
- def init_val(self):
- self.insert(1, 1, 1./6)
- self.insert(2, 2, 1./6)
- self.insert(3, 3, 1./6)
- self.insert(4, 4, 1./6)
- self.insert(5, 5, 1./6)
- self.insert(6, 6, 1./6)
- return self
-
- def roll_hndl(self, smv, dmv, sev, dev):
- nmv = smv + dmv
- assert type(dev) in [int, long]
- if type(sev) in [int, long]:
- nev = [sev]
- else:
- nev = list(sev)
- nev.sort()
- nev.append(dev)
- nev.sort()
- return nmv, tuple(nev)
- def reroll_hndl(self, smv, dmv, sev, dev):
- assert type(dev) in [int, long]
- if type(sev) in [int, long]:
- nev = [sev]
- else:
- nev = list(sev)
- nev.sort()
- if(dev <= nev[0]):
- return smv, sev
- nmv = smv - nev[0] + dev
- nev[0] = dev
- nev.sort()
- return nmv, tuple(nev)
- def roll(self):
- return self.add(dice().init_val(), self.roll_hndl)
- def reroll(self):
- return self.add(dice().init_val(), self.reroll_hndl)
- def dice_op(roll, reroll):
- assert roll > 0
- rslt = dice().init_val()
- for i in range(0, roll - 1):
- rslt = rslt.roll()
- for i in range(0, reroll):
- rslt = rslt.reroll()
- rslt.calc_expected()
- rslt.calc_variance()
- return rslt
- if __name__ == '__main__':
- for i in range(1, 9):
- r = []
- for j in range(0, 6):
- dc = dice_op(i, j)
- r.append('E:{0:.6f}/D:{1:.6f}'.format(dc.expected, dc.variance))
- print ' '.join(r)
复制代码 |
|