爐石傳說從5級打到傳說需要打多少場?
一般問題的數學表述如下:假設一個人勝率為p,目標是獲得m個凈勝場,求此人需要打的總場數的期望?
========================================
考慮到這是一個實際問題(下面回答里也提到有掉分的限制),因此編輯了一下問題。
感謝各位的回答!~
為方便不了解遊戲的人,先簡要敘述一下爐石天梯規則:
- 5級以上每級為5顆星,每勝一場加1顆星
- 5級5星勝利後為4級1星
- 4級1星戰敗後為4級0星,再輸為5級4星
- 1級5星勝利後為傳說
- 5級以前(20-6級)有連勝獎勵,5級後沒有
- 設定從5級0星開始沖傳說
由上述規則,可得 如勝率為100%則需要26場比賽衝上傳說。簡單寫了一個程序,針對每個勝率,按 200萬個玩家模擬過程,計算平均數。由於勝率低於45%以後所需勝場接近1萬場,因此只模擬勝率99%-45%的情況:
勝率 總場次
99 26.52
98 27.062
97 27.625
96 28.217
95 28.825
94 29.467
93 30.138
92 30.841
91 31.577
90 32.339
89 33.154
88 34.002
87 34.897
86 35.835
85 36.835
84 37.891
83 39.009
82 40.193
81 41.435
80 42.771
79 44.204
78 45.743
77 47.358
76 49.099
75 50.993
74 53.031
73 55.258
72 57.652
71 60.261
70 63.125
69 66.265
68 69.762
67 73.63
66 77.943
65 82.745
64 88.272
63 94.575
62 101.744
61 110.165
60 119.997
59 131.792
58 146.093
57 163.832
56 186.098
55 215.126
54 254.11
53 308.344
52 387.328
51 507.567
50 701.023
49 1031.563
48 1624.788
47 2736.036
46 4938.144
45 9455.334
以圖顯示基本是這樣:
代碼比較簡單就不放了。其實還可以模擬下20級沖5級的數據,如果感興趣的人多的話。
=========================3.6.17更新=================================
以下是20級到5級的數據,還是先複習下規則:
- 20-5存在連勝,即連續勝利2場後,每場勝利加2顆星,戰敗則連勝消失
- 根據級別不同,升級所需要的星數量也不同
- 存在保護機制,即升到15,10以後不會再降入下一級,而是會停留在該級別的0星
為了方便對比,我把5級到傳說的數據羅列在了一起,同時還包括歸一化以後的數據。基於同樣的理由,只計算99%-41%的勝率:
數據歸一化後的圖:
總體來看,隨勝率下降,20到5級的場次上升速度要比5級到傳說平緩很多,這應該歸功於連勝機制,而兩者速率的拐點都出現在49%到45%之間。也就是說:
- 想要在低分段快速上分,你的卡組勝率不能低於45%
- 想要衝傳說,卡組勝率最好超過50%
- 勝率低於45%之後,連勝也幫不了你多少忙了
我們再選取一個實戰數據對比分析一下,下圖是國服最新一期各職業勝率圖:
最高的是54%,最低為44%。這兩個職業上分的效率差距有多大呢?
根據上表,54%勝率從20級到傳說所需場次是232.057 + 254.11 = 486.167場,而44%的場次是960.828 + 19028.304 = 20275.896場,前者只是後者的2.3%……
所以,不要看兩者勝率在數字上差距不大,可具體到上分速度則是判若雲泥。更不用說這只是平均情況,我相信很多人使用T1卡組的勝率都會遠超過54%。
更新C#代碼,只顯示主要代碼,其它的略去
long fiveToLengend()
{
int level = 5;
int star = 0;
long games = 0;
while (level &> 0)
{
if (r.Next(100) &< winPosibility)
{
star++;
if (star &> 5)
{
star = 1;
level--;
}
}
else
{
if (level != 5 || star != 0)
{
star--;
if (star &< 0)
{
star = 4;
level++;
}
}
}
games++;
}
return games;
}
long twentyToFive()
{
int level = 20;
long games = 0;
int star = 0;
int consecutiveWinning = 0;
while (level &> 5)
{
if (r.Next(100) &< winPosibility)
{
consecutiveWinning++;
if (consecutiveWinning &> 2)
star += 2;
else star++;
int maxStar = getStars(level);
if (star &> maxStar)
{
star = star - maxStar;
level--;
}
}
else
{
consecutiveWinning = 0;
if ((level != 20 level != 15 level != 10) || star != 0)
{
star--;
if (star &< 0)
{
level++;
star = getStars(level) - 1;
}
}
}
games++;
}
return games;
}
int getStars(int level)
{
if (level &<= 10)
{
return 5;
}
else if (level &<= 15)
{
return 4;
}
else if (level &<= 20)
{
return 3;
}
else if (level &<= 25)
{
return 2;
}
else return 1;
}
以前在群里做過一個,用遞推。
謝 @萌萌噠的小錐 邀
- 不考慮連勝獎勵,且勝率恆定的情況下:
先考慮簡單的,不扣分的模型.
設 局完成目標,最後一局必須是勝利,前面要勝 局.
然後考慮帶扣分的模型
如果扣分無下限,那麼看成在 x=w 處有個吸收壁的隨機遊走...
那麼平均吸收時間為
但實際上有個下限,扣到沒分後就扣無可扣了,再怎麼輸也無所謂了...
我們可以使用馬爾科夫狀態轉移矩陣來表示這個關係:
於是n回合後累計的達成概率就成了:
其中向量U是個...全零除了當前段位對應值是1的向量.
接下來很煩的解矩陣過程跳過,解完兩邊取差分得到:
然後一樣的算期望...不過我不會化簡...
M[n_,p_:p]:=SparseArray[{{1,1}-&>1-p,{n,n}-&>1,{n,n-1}-&>0,
Band[{1,2}]-&>p,Band[{2,1}]-&>1-p},{n,n}];
Ladder[n_,p_:p,s_:1]:=Mean@FirstPassageTimeDistribution[DiscreteMarkovProcess[s,M[n+1,p]],n+1]
數值數值結果和 @王平 的模擬結果相符.
- 不考慮連勝獎勵,但是勝率不定的情況下.
假設每一個段位的勝率是恆定的,然後用期望的可加性算一下就好了...
- 考慮連勝獎勵,且勝率不定的情況下.
有具體數據的話能用馬爾科夫矩陣算算...
一般情況我感覺是推不出來的.....
上個月月末用海盜戰,50場不到就傳說了
剛好最近在自學Python,用下面代碼計算傳說的平均場數:
(按照目前5,10,15級有保護機制的新規則計算)
# How many games we need to play before reaching legendary rank with a certain winning percentage in Hearthstone
from random import randint
result = []
for win_pct in range(45, 101):
num_all = 0
num_20to5 = 0
for repeat_num in range(0, 1000000):
stars = 0
num_played = 0
counter = 0
while stars &<= 60:
num_played += 1
if randint(1, 100) &<= win_pct:
counter += 1
if counter &>= 3:
stars += 2
else:
stars += 1
else:
counter = 0
if (stars != 0) and (stars - 15 != 0) and (stars - 35 != 0):
stars -= 1
num_20to5 += num_played
while (stars &<= 85) and (stars &> 60):
num_played += 1
if randint(1, 100) &<= win_pct:
stars += 1
else:
if stars != 61:
stars -= 1
num_all += num_played
result.append([win_pct, num_all / 1000000.0, num_20to5 / 1000000.0, ((num_all - num_20to5) / 1000000.0) + 1])
for item in result:
f = open("result.txt", "a+")
f.writelines("winning percentage is %d, total: %.2f , 20 to 5: %.2f , 5 to legendary: %.2f
" % (item[0],
item[1], item[2], item[3]))
f.close()
這個題目的確是一個個馬爾可夫過程,但是可以用稍微簡單的方法求解。
首先勝率如果恆定為P,完成一局比賽之後累計凈勝場數的期望值
E=1P+(-1)(1-P)=2P-1
所以當P ≤ 1/2時,進行任何場數的比賽,都不可能使凈勝場數的期望為一個正數M,所以只有P&>1/2時,達到凈勝場數M時總場數才存在期望值
E(凈勝場數M時的總場數)=M/(2P-1)m/(2p-1)
我只知道,
第一次沖傳說,用佛祖騎,一個月打了大概200場,上傳說。5級之前幾乎沒輸過,月初。(再前一個月沖傳說失敗,一個月大概打了300場佛祖騎)
第二次上傳說,莫名奇妙。中速獵加火妖法上5,換了套同學的沙龍德,從5開始,幾乎沒輸過。上傳說之後看了眼德魯伊天梯總共才贏了72場。
第一個次的上傳說經歷,說明這個事兒吧,是需要專心,努力,吃透套牌,摸清環境,順勢而為的。
第二次上傳說,說明,1.德魯伊胡起來真的爆炸,2.導演的確該削弱
推薦閱讀:
※為什麼數學是不符合現實的,π根本不存在的啊,就如同不存在完美的圓?
※數學對於編程有多重要?
※奧迪A6L現在算不算豪車,一般人能開的上嗎?
※我這回數學考試沒考好,只考了68分,但老師讓家長簽字,怎麼辦啊?大家幫我想想辦法?
※如何證明不可計算的函數比可計算的函數多?
TAG:數學 | 概率 | 隨機過程 | 爐石傳說Hearthstone | 概率論與數理統計 |