팁과 노하우

전체보기

모바일 상단 메뉴

본문 페이지

[실험] 내가 궁금해서 만든 문어 기댓값 계산기

엑조관부
댓글: 4 개
조회: 14641
추천: 5
2025-02-16 21:25:16


해 볼 수 있는 웹페이지
https://oljindudol.github.io/moontaforce.github.io/

한 줄 결론: 어떤 상태에서든 걍 7렙달리는게 제일 효율적임

인벤에 통계적으로 분석한 글은 많이봤고
7렙 전략이 좋다는 글도 많이보았으나
첫 번째로 수학적 확률이 궁금하였고
두 번째로 99번째에 6렙이면 강화를 누르는게 맞는 전략인가? 등을 검증하기 위하여 만들어보았습니다.

현재레벨,강화 횟수 두 가지 상태를 기준으로 
- 현재 보상과 강화를 클릭 할 시 기대보상을 계산하여 출력해줍니다.
- 보상받는것과 강화누르는것 중 유리한 곳에 초록색을 칠해줍니다.
- 조각,기운,경쿠 기준으로 선택하여 볼 수 있습니다.

다이나믹프로그램 기법으로 구현하였고
아래는 프로토타입으로 만든 c++ 코드입니다
자바스크립트버전은 공개된 html에 들어있슴다.

//코드주의
//=========================================
constexpr int DAJO = 0; //가중치 1
constexpr int GIUN = 1; //가중치 4 / 100
constexpr int CUPON = 2; // 가중치 20

struct RateInfo
{
float stayRate; // 유지확률
float upRate;   // 등급상승확률
float downRate; // 등급하락확률
float runRate;  // 도망확률
};

vector<float> rewards;
vector<RateInfo> RateInfos;
//dp[남은카운트][현재레벨] = 강화눌렀을시 보상기댓값(조각기준)
vector<vector<float>> dp;


void init()
{
rewards.resize(10);
rewards[0] = 0.f;
rewards[1] = 0.f;
rewards[2] = 1.f;
rewards[3] = 3.f;
rewards[4] = 6.f;
rewards[5] = 10.f;
rewards[6] = 15.f;
rewards[7] = 50.f;
rewards[8] = 150.f;
rewards[9] = 300.f;

RateInfos.resize(10);

//stay  ,up     ,down  ,run
RateInfos[0] = { 1.f  ,0.0f   ,0.f    ,0.f }; //destroyed;
RateInfos[1] = { 0.f  ,1.0f   ,0.f    ,0.f };
RateInfos[2] = { 0.4f ,0.6f   ,0.f    ,0.f };
RateInfos[3] = { 0.f  ,0.5f   ,0.5f   ,0.f };
RateInfos[4] = { 0.f  ,0.4f   ,0.6f   ,0.f };
RateInfos[5] = { 0.f  ,0.307f ,0.693f ,0.f };
RateInfos[6] = { 0.f  ,0.205f ,0.765f ,0.03f };
RateInfos[7] = { 0.f  ,0.103f ,0.857f ,0.04f };
RateInfos[8] = { 0.f  ,0.05f  ,0.9f   ,0.05f };
RateInfos[9] = { 1.f  ,0.f    ,0.f    ,0.f };

dp.resize(101, vector<float>(10));

//초항 (남은 횟수 없을때) 초기화
for (int lv = 0; lv < 10; ++lv)
{
dp[0][lv] = rewards[lv];
}

//dp 테이블 업데이트
for (int RemainCnt = 1; RemainCnt < 101; ++RemainCnt)
{
for (int Lv = 1; Lv < 9; ++Lv)
{
//유지경우
dp[RemainCnt][Lv] += (max(rewards[Lv], dp[RemainCnt - 1][Lv]) * RateInfos[Lv].stayRate);
//등급상승경우
dp[RemainCnt][Lv] += (max(rewards[Lv + 1], dp[RemainCnt - 1][Lv + 1]) * RateInfos[Lv].upRate);
//등급하락경우
dp[RemainCnt][Lv] += (max(rewards[Lv - 1], dp[RemainCnt - 1][Lv - 1]) * RateInfos[Lv].downRate);
//도망경우
dp[RemainCnt][Lv] += (rewards[0] * RateInfos[Lv].runRate);
}
dp[RemainCnt][9] = dp[RemainCnt - 1][9];
}
}

// _Mode 
// DAJO = 0; //가중치 1
// GIUN = 1; //가중치 4 / 100
// CUPON = 2; // 가중치 20
float getExpectedReward(int _RemainCnt, int _CurLv, const int _Mode)
{
float ret = dp[_RemainCnt][_CurLv];
//기운기준
if (GIUN == _Mode)
{
return ret / 25.f;
}
//경쿠기준 
if (CUPON == _Mode)
{
return ret * 20.f;
}

//디폴트 (다조기준)
return ret;
}


int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

//출력용 테이블 초기화
init();

//인풋박스1과 인풋박스2로 몇번남았는지,현재레벨을 입력받은후 확률을 출력
//getExpectedReward(2,3,DAJO);
return 0;
}

//================

해 볼 수 있는 웹페이지
https://oljindudol.github.io/moontaforce.github.io/

제작자는 no-css단 이기때문에 2시간만에 개발을 마쳤습니다

모바일 게시판 하단버튼

댓글

새로고침
새로고침

모바일 게시판 하단버튼

지금 뜨는 인벤

더보기+

모바일 게시판 리스트

모바일 게시판 하단버튼

글쓰기

모바일 게시판 페이징

최근 HOT한 콘텐츠

  • 메이플
  • 게임
  • IT
  • 유머
  • 연예
AD