输一把睡觉的胜率更高,我就是靠这个技巧一点一点的把三国杀国战胜率提高到42%的。
如果用简单的概率计算,会认为无论用什么方法,胜率不变。计算方法很简单,因为人的能力是固定的,那么从大数据的角度来说,每一场比赛都是能力抽取的一次彩票,那么睡还是不睡,只是抽彩票时间发生了变化,时间长了,打1000局,10000局,最终还是会均值回归到自己的胜率。
但是这个结论其实不符合我们平常的感觉。因为如果预先假设了一个先天的不变的「胜率」,那么无论怎么操作,真实的胜率都只会围绕着这个胜率波动,不会出现系统性的偏差。这是个套套逻辑。
不符合我们感觉的原因在于,『存在一个先天不变的胜率』这个假设本身可能就是错的。
打游戏同样存在状态,有的时候状态好就是胜率高一点,状态差就胜率低一点。所以我们的目的就是尽量的让胜率高的时候多打一会,胜率低的时候少打一会。
但是自己其实也不知道自己什么时候状态好,所以就需要观察自己输赢的信号。而赢和输本身,其实就意味着一些事情:
给定其他条件不变,当我这一把输了,那么意味着相比之前对自己状态的判断,现在会更悲观;
给定其他条件不变,当我这一把赢了,那么意味着相比之前对自己的状态判断,现在会更乐观。
所以输和赢是一个对自己状态判断有效的信号,尤其是第一把。比如自己状态好的时候胜率60%,状态差的时候胜率30%,概率各50%,那么这个时候平均状态是45%。
如果第一把输了,最明智的决定就是立刻放弃去睡觉,这样第二天又可以抽一下自己的状态,如其不然,输第一把意味着自己大概率是处在差状态下的,期望值不到平均的45%。
同样的道理,如果第一把赢了,就应该继续打下去,因为赢这件事情本身,就意味着自己可以当前状态不错。
所以直觉上讲,输一把就睡觉,应该是一个更谨慎,更容易提高自己胜率的做法。
假设一个人状态好的时候胜率60%,状态差的时候胜率30%。好的状态和坏的状态概率各50%,用输一把睡觉,和赢一把睡觉各自打1,000,000局游戏,会发生什么,代码很简单:
#%% import numpy as np n = 1 rd = 0 win_rd = 0 p_1, p_2 = 0.3, 0.6 def refresh(p_1,p_2,prob): if int(np.random.binomial(1, prob, 1)): return p_1 else: return p_2 origin_p = refresh(p_1,p_2,0.5) #%% ## 输一场就睡觉,rd是总回合数,win_rd是胜利的回合数 while True: if rd >= 1000000: print("the final winning odds is " + str(win_rd/rd)) break if int(np.random.binomial(1, origin_p, 1)): rd += 1 win_rd += 1 else: rd += 1 origin_p = refresh(p_1, p_2, 0.5) #%% ## 赢一场就睡觉 while True: if rd >= 1000000: print("the final winning odds is " + str(win_rd/rd)) break if not int(np.random.binomial(1, origin_p, 1)): rd += 1 else: win_rd += 1 rd += 1 origin_p = refresh(p_1, p_2, 0.5)
结果是赢一场就睡觉的总胜率是 0.40,而输一场就睡觉的胜率是 0.49。后者显著占优。理论上很容易解释:赢一场就睡觉,可能让自己本来很好的状态被过早打断,而本来很差的状态却以更大的概率延长了;而输一场就睡觉,可以及时的止损,还能够尽量的利用自己的高状态多打几局。
但是『输一场就睡觉』这个策略是不是最优的呢?理论告诉我们很可能不是的。因为当赢了很多场之后,比如连续赢了10场,这个时候自己处在高水平状态的概率是很大的,如果就仅仅因为一场输了而去睡觉,可能依然是过早的终结了。所以可能可以调整策略,来压榨出自己更多的胜率。
所以我们可能需要稍微复杂一点的贝叶斯策略:每次根据结果来对自己的状态进行判断。还是做一个模拟,每天晚上根据自己的 赢的局数/总局数 是否超过一个概率来决定自己是不是睡觉,这个概率我称之为关键概率。这个关键概率从0.01到1,我模拟了100次,把总胜率做了一个图,横轴是关键概率,纵轴是自己打完10万局的总胜率。
结果非常有意思,当这个概率小于0.3的时候,这个时候无论是高状态还是低状态,都可能会一晚上玩很长的时间,所以初始的高或者低就非常重要了,所以在关键概率小于0.3的时候,会非常随机。
而当关键概率在0.3-0.6之间的时候,意味着当自己是低状态的时候,很大概率会早早去睡觉,而高状态可以玩很久,所以当玩的局数足够多的时候,总胜率非常接近高状态的胜率0.6,这也是最优的选择。
而如果对自己过于苛刻,过于追求完美,对自己的要求已经超出了自己能力的范围,那么胜率反而会不断下降。因为高状态也会被容易打断。到最后极端的时候,关键概率=1,输一盘就睡觉,这个时候概率就回到了0.49,这也是我们最初计算的胜率。
优化求解的代码是:
## 优化后的算法 odd = [] thres = [] for prob in range(0,100): thres.append(prob/100) origin_p = refresh(p_1, p_2, 0.5) tmp_rd = 0 tmp_win_rd = 0 rd = 0 win_rd = 0 while True: if rd >= 100000: print("the final winning odds is " + str(win_rd/rd)) odd.append(win_rd/rd) break tmp_rd += 1 rd += 1 if int(np.random.binomial(1, origin_p, 1)): tmp_win_rd += 1 win_rd += 1 else: if tmp_win_rd/tmp_rd >= prob/100: continue else: tmp_win_rd = 0 tmp_rd = 0 origin_p = refresh(p_1, p_2, 0.5)
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有