명일방주 픽업을 위한 평균 가챠횟수 4편(일반 헤드헌팅)
3편에 이어서...
1. 일반 이중픽업에서 특정한 오퍼레이터를 얻기 위해 시도하는 평균적인 가챠횟수는?
기본 확률은 6성 2%, 5성 8%, 4성 50%, 3성 40%
이중 픽업에서 픽업 오퍼레이터는 2%의 50%확률로 등장한다.
아와 유넥티스가 등장할 확률은 1%로 동등하게 등장한다면 각각 0.5%확률로 등장
나머지 6성 오퍼레이터는 1%확률로 등장함
이것을 바탕으로 앞에서 사용한 코드에서 확률을 조정하면 된다.
pickup_list = ['유넥티스','아','기타 6성','5성','4성','3성']
weight_list = [0.005,0.005,0.01,0.08,0.50,0.40]
def try_eunec(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(['유넥티스','아','기타 6성','5성'],weights=[0.005,0.005,0.01,0.98])
if a == ['5성'] 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 ==["아"] or a ==['기타 6성']:
total_try_num = total_try_num + try_num
try_num = 0
else:
six_prob = 0.02*(try_num-49)
pickup_list2 = ['유넥티스','아','기타 6성','기타']
pickup_prob = six_prob*0.5
a = random.choices(pickup_list2,weights=[pickup_prob/2,pickup_prob/2,six_prob-pickup_prob,1-six_prob])
if a == ["유넥티스"]:
total_try_num = total_try_num + try_num
break
elif 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_eunec(pickup_list,weight_list)
sum_of_try = sum_of_try + try_num
expect = sum_of_try/total_man
print(expect)
138.406...., 138.554...... 유넥티스를 얻기 위해 평균적으로 약 138회 가챠를 시도한다.
2. 일반 단독픽업에서 픽업 오퍼레이터를 얻기 위해 시도하는 평균적인 가챠횟수는?
기본 확률은 6성 2%, 5성 8%, 4성 50%, 3성 40%
명일방주 단독픽업에서 픽업 오퍼레이터가 등장할 확률은 2%의 50%인 1%확률로 등장한다.
나머지 6성 오퍼레이터는 1%확률로 등장한다.
앞에서 사용한 코드에서 확률만 조정하면 세일리치를 얻기 위해 필요한 평균 가챠횟수를 알 수 있다.
pickup_list = ['세일리치','기타 6성','5성','4성','3성']
weight_list = [0.01,0.01,0.08,0.50,0.40]
def try_sail(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(['세일리치','기타 6성','5성'],weights=[0.01,0.01,0.98])
if a == ['5성'] 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 ==['기타 6성']:
total_try_num = total_try_num + try_num
try_num = 0
else:
six_prob = 0.02*(try_num-49)
pickup_list2 = ['세일리치','기타 6성','기타']
a = random.choices(pickup_list2,weights=[six_prob/2,six_prob/2,1-six_prob])
if a == ["세일리치"]:
total_try_num = total_try_num + try_num
break
elif 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_sail(pickup_list,weight_list)
sum_of_try = sum_of_try + try_num
expect = sum_of_try/total_man
print(expect)
69.029, 69.034...., 69.056.... 세일리치를 얻기 위해 평균적으로 약 69회 가챠를 시도한다.
'알고리즘 > 알고리즘 일반' 카테고리의 다른 글
합의 차이가 최소가 되는 분할 1편 (0) | 2021.11.16 |
---|---|
k fold cross validation을 구하는 알고리즘 문제 복기하기 (0) | 2021.11.15 |
명일방주 픽업을 위한 평균 가챠횟수 3편(한정 헤드헌팅) (0) | 2021.11.09 |
명일방주 픽업을 위한 평균 가챠횟수 2편(위기협약) (0) | 2021.11.09 |
명일방주 픽업을 위한 평균 가챠횟수 1편(6성 획득) (0) | 2021.11.09 |
TAGS.