몇페이지 전의 질문글에 알량한 수학적지식으로 끄적거리다가


이 청사진에 완제품을 10만개 투입한다면 전설 완제품이 35개 를 얻을수있고


생산량보너스가있고 품질업확률도 높은 전자기공장이라면 220개정도 된다.


라고 답했었는데....


아무리봐도 내 체감보다 너무 낮은느낌이 들었다.


이 청사진은 나에게 꾸준히 충분한만큼의 전설을 공급하고 있었기에...


그런데, 이런의문에 재계산을 할때마다 달라지는결과들..


그래서 수학은 갖다버리고 그냥 프로그램적인 시뮬레이션을 돌려보리라 마음먹고


AI에게 초안을 부탁했더니, 35개가 아닌 1600개의 전설이 남는다는 결과를 주는게 아닌가?


여기까지가, 오늘 월루하며 진행됐던 내용. 하필 오늘이 송년회인지라 여기서 더 진행되지못했는데...


이제 퇴근후 AI가 준 코드를 분석해봤더니..


완제품을 갈갈하는데 품질상승판정체크를 통과한다면 품질상승된 원재료가 아닌 완제품을 돌려주도록 되어있는게 아닌가..


이부분을 수정하고 시뮬레이션을 돌려보니...


대강 10만개투입시 전설이 35개언저리로 나온다...


전자기공장이면 220개인게 맞고..


내 체감은 이보다 훨씬 높다고 생각했는데...


이 청사진이 내 생각보다 훨씬많은 완제품들을 빨아먹고 있었을뿐이라는 거였다.


결국 처음에 정한 답을 바꾸는건 옳지못하다는 교훈을 얻으며


잘못된정보를 제공한점에대해 사과한다.







그리고 아래는 


시뮬레이션코드


c#으로 작성됐으며 AI초안이나 인간의 검토후 수정됐으니 아마 맞을거라 본다. 




    // ========================== // ===== 설정 파라미터 ===== // ========================== const int MaxGrade = 5; static double RecycleMaterialReturn = 0.25; static double RecycleUpgradeChance = 0.248; static double ReassembleUpgradeChance = 0.248; static readonly double[] UpgradeStepDistribution = { 0.90, 0.09, 0.009, 0.0009 }; static int[] InitialItems = { 0, 100000, 0, 0, 0, 0 }; // ========================== static Random rng = new Random(); static void Main() { int[] items = new int[MaxGrade + 1]; double[] materials = new double[MaxGrade + 1]; Array.Copy(InitialItems, items, items.Length); for (int grade = 1; grade < MaxGrade; grade++) { ProcessGrade(grade, items, materials); } Console.WriteLine("=== 최종 결과 ==="); for (int g = 1; g <= MaxGrade; g++) { Console.WriteLine($"{g}단계 완제품: {items[g]} (잔여 재료 {materials[g]:F2})"); } } static void ProcessGrade(int grade, int[] items, double[] materials) { while (true) { int toDisassemble = items[grade]; if (toDisassemble == 0 && materials[grade] < 1.0) break; items[grade] = 0; // 1+ 분해 (재료만 생성) for (int i = 0; i < toDisassemble; i++) { materials[grade] += RecycleMaterialReturn; } // 2+ 조립 (여기서만 업그레이드) int assembled = 0; while (materials[grade] >= 1.0) { materials[grade] -= 1.0; assembled++; if (rng.NextDouble() < ReassembleUpgradeChance) { int newGrade = Upgrade(grade); items[newGrade]++; } else { items[grade]++; } } if (assembled == 0) break; } } static int Upgrade(int grade) { int step = RollUpgradeStep(); return Math.Min(grade + step, MaxGrade); } static int RollUpgradeStep() { double roll = rng.NextDouble(); double acc = 0; for (int i = 0; i < UpgradeStepDistribution.Length; i++) { acc += UpgradeStepDistribution[i]; if (roll < acc) return i + 1; } return UpgradeStepDistribution.Length + 1; } }