명일방주 픽업을 위한 평균 가챠횟수 3편(한정 헤드헌팅)
2편에 이어서...
명일방주 한정 헤드헌팅 딥드라운 라멘트에서는 6성 오퍼레이터가 36명 등장한다.
33명은 일반 오퍼레이터이고 나머지 2명은 스카디 더 커럽팅 하트, 켈시, 마지막 1명은 W이다.
기본 확률은 6성 2%, 5성 8%, 4성 50%, 3성 40%로 등장한다.
스카디 더 커럽팅 하트와 켈시는 6성 등장 확률의 70%인 1.4%확률로 등장한다.
이들이 동일한 확률로 등장한다면 0.7%, 0.7%확률로 등장한다.
나머지 34명은 W는 나머지 일반 오퍼레이터의 5배 확률로 등장한다.
일반 오퍼레이터가 33명있고 W가 5명있다고 생각하면 총 38명에 대하여 일반 오퍼레이터는 0.6/38=0.01578947% = 약 0.016%
W는 0.6*5/38=0.0789473685% = 약 0.079%로 등장한다.
1. 한정 캐릭터 스카디 더 커럽팅 하트를 얻기까지 시도한 평균 가챠 횟수는?
1편, 2편에서 이용한 코드에서 확률만 조정하면 된다
pickup_list = ['스카디 더 커럽팅 하트','켈시','W','기타 6성','5성','4성','3성']
weight_list = [0.007,0.007,3/3800,0.6*33/3800,0.08,0.50,0.40]
def try_skadi(pickup_list,weight_list):
total_try_num = 0
try_num = 1
bonus=False
while 1:
if bonus == False:
#10회 이내 보너스
if try_num < 10:
a = random.choices(pickup_list,weights=weight_list)
else:
a = random.choices(['스카디 더 커럽팅 하트','켈시','W','기타 6성','5성'],weights=[0.007,0.007,3/3800,0.6*33/3800,0.98])
if a == ['5성'] or a == ['W'] or a == ['켈시'] or a == ['기타 6성']:
bonus = True
elif a== ['스카디 더 커럽팅 하트']:
total_try_num = total_try_num + try_num
break
else:
if try_num <= 50:
a = random.choices(pickup_list,weights=weight_list)
if a == ["스카디 더 커럽팅 하트"]:
total_try_num = total_try_num + try_num
break
elif a ==["W"] or a == ['켈시'] or a ==['기타 6성']:
total_try_num = total_try_num + try_num
try_num = 0
else:
six_prob = 0.02*(try_num-49)
pickup_list2 = ['스카디 더 커럽팅 하트','켈시','W','기타 6성','기타']
pickup_prob = six_prob*0.7
nonpickup_prob = 1-pickup_prob
a = random.choices(pickup_list2,weights=[pickup_prob/2,pickup_prob/2,nonpickup_prob*5/38,nonpickup_prob*33/38,1-six_prob])
if a == ["스카디 더 커럽팅 하트"]:
total_try_num = total_try_num + try_num
break
elif a ==["켈시"] or a == ['W'] or a ==['기타 6성']:
total_try_num = total_try_num + try_num
try_num = 0
try_num += 1
return total_try_num
total_man = 1000000
sum_of_try = 0
for _ in range(total_man):
try_num = try_skadi(pickup_list,weight_list)
sum_of_try = sum_of_try + try_num
expect = sum_of_try/total_man
print(expect)
141.47.... , 141.455... 한정 캐릭터 스카디 더 커럽팅 하트를 얻기 위해 평균적으로 약 141회 가챠를 시도한다.
2. W를 얻기까지 시도한 평균 가챠 횟수는?
목표를 스카디 더 커럽팅 하트에서 W로 조정하면 된다.
def try_W(pickup_list,weight_list):
total_try_num = 0
try_num = 1
bonus=False
while 1:
if bonus == False:
#10회 이내 보너스
if try_num < 10:
a = random.choices(pickup_list,weights=weight_list)
else:
a = random.choices(['스카디 더 커럽팅 하트','켈시','W','기타 6성','5성'],weights=[0.007,0.007,3/3800,0.6*33/3800,0.98])
if a == ['5성'] or a == ['스카디 더 커럽팅 하트'] or a == ['켈시'] or a == ['기타 6성']:
bonus = True
elif a== ['W']:
total_try_num = total_try_num + try_num
break
else:
if try_num <= 50:
a = random.choices(pickup_list,weights=weight_list)
if a == ["W"]:
total_try_num = total_try_num + try_num
break
elif a ==["스카디 더 커럽팅 하트"] or a == ['켈시'] or a ==['기타 6성']:
total_try_num = total_try_num + try_num
try_num = 0
else:
six_prob = 0.02*(try_num-49)
pickup_list2 = ['스카디 더 커럽팅 하트','켈시','W','기타 6성','기타']
pickup_prob = six_prob*0.7
nonpickup_prob = six_prob-pickup_prob
a = random.choices(pickup_list2,weights=[pickup_prob/2,pickup_prob/2,nonpickup_prob*5/38,nonpickup_prob*33/38,1-six_prob])
if a == ["W"]:
total_try_num = total_try_num + try_num
break
elif a ==["켈시"] or a == ['스카디 더 커럽팅 하트'] or a ==['기타 6성']:
total_try_num = total_try_num + try_num
try_num = 0
try_num += 1
return total_try_num
total_man = 1000000
sum_of_try = 0
for _ in range(total_man):
try_num = try_W(pickup_list,weight_list)
sum_of_try = sum_of_try + try_num
expect = sum_of_try/total_man
print(expect)
877.3968...... 876.317..., 877.057......, W를 얻기 위해 평균적으로 약 877회 가챠를 시도한다.
'알고리즘 > 알고리즘 일반' 카테고리의 다른 글
k fold cross validation을 구하는 알고리즘 문제 복기하기 (0) | 2021.11.15 |
---|---|
명일방주 픽업을 위한 평균 가챠횟수 4편(일반 헤드헌팅) (0) | 2021.11.09 |
명일방주 픽업을 위한 평균 가챠횟수 2편(위기협약) (0) | 2021.11.09 |
명일방주 픽업을 위한 평균 가챠횟수 1편(6성 획득) (0) | 2021.11.09 |
deque를 사용해야할때는? (0) | 2021.11.08 |