|
2025-02-16 21:25
조회: 16,300
추천: 5
내가 궁금해서 만든 문어 기댓값 계산기![]() 해 볼 수 있는 웹페이지 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시간만에 개발을 마쳤습니다
|

