Dungeon & Fighter

커뮤니티

[공통] MATLAB 시뮬레이션으로 12증폭 기대값 계산하기.

function dnf_monte_carlo_sim(num_simulations)
% 실행 시 시뮬레이션 횟수를 지정하지 않으면 기본 10,000회 실행
clc;clear all;
if nargin < 1
num_simulations = 1e+7;
end
target_level = 12; % 목표 증폭 수치
% 규칙 세팅
probs = [1.0, 1.0, 1.0, 1.0, 0.8, 0.7, 0.6, 0.7, 0.6, 0.5, 0.4, 0.3];
costs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
fail_levels = [0, 1, 2, 3, 3, 4, 5, 4, 5, 6, 0, 0];
% 추가된 고정 골드 비용
gold_per_attempt = 258720;
% 결과 저장 배열
results_attempts = zeros(num_simulations, 1);
results_mosun = zeros(num_simulations, 1);
results_tickets = zeros(num_simulations, 1);
results_gold = zeros(num_simulations, 1); % 골드 배열 추가
fprintf('--- +%d 증폭 몬테카를로 시뮬레이션 %d회 실행 중 ---\n', target_level, num_simulations);
fprintf('잠시만 기다려줘...\n');
% 몬테카를로 시뮬레이션 루프
for i = 1:num_simulations
current_level = 0;
attempts = 0;
mosun = 0;
tickets = 0;
gold = 0;
while current_level < target_level
attempts = attempts + 1;
idx = current_level + 1;
% 재화 소모 (모순 + 골드)
mosun = mosun + costs(idx);
gold = gold + gold_per_attempt;
% 확률 굴리기
if rand() <= probs(idx)
% 성공
current_level = current_level + 1;
else
% 실패
if current_level >= 10
tickets = tickets + 1;
end
current_level = fail_levels(idx);
end
end
% 결과 기록
results_attempts(i) = attempts;
results_mosun(i) = mosun;
results_tickets(i) = tickets;
results_gold(i) = gold;
end
% --- 통계 계산 ---
mean_attempts = mean(results_attempts);
median_attempts = median(results_attempts);
std_attempts = std(results_attempts);
mean_mosun = mean(results_mosun);
median_mosun = median(results_mosun);
std_mosun = std(results_mosun);
mean_gold = mean(results_gold);
median_gold = median(results_gold);
std_gold = std(results_gold);
mean_tickets = mean(results_tickets);
median_tickets = median(results_tickets);
% --- 텍스트 결과 출력 ---
fprintf('\n=== 시뮬레이션 완료 결과 ===\n');
fprintf('[누적 시도 횟수]\n');
fprintf(' - 평균: %.1f회\n', mean_attempts);
fprintf(' - 상위 50%% (중앙값): %.1f회\n', median_attempts);
fprintf(' - 표준편차: %.1f회\n', std_attempts);
fprintf('\n[소모 재화 (모순의 결정체)]\n');
fprintf(' - 평균: %.1f개\n', mean_mosun);
fprintf(' - 상위 50%% (중앙값): %.1f개\n', median_mosun);
fprintf(' - 표준편차: %.1f개\n', std_mosun);
fprintf('\n[소모 재화 (골드)]\n');
fprintf(' - 평균: %.0f 골드\n', mean_gold);
fprintf(' - 상위 50%% (중앙값): %.0f 골드\n', median_gold);
fprintf(' - 표준편차: %.0f 골드\n', std_gold);
fprintf('\n[장비 보호권 소모량]\n');
fprintf(' - 평균: %.1f장\n', mean_tickets);
fprintf(' - 상위 50%% (중앙값): %.1f장\n', median_tickets);
fprintf('============================\n');
% --- 그래프 시각화 (3개 패널로 확장) ---
figure('Name', '+12 증폭 시뮬레이션 결과', 'Position', [100, 100, 1500, 400]);
% 1. 시도 횟수 분포
subplot(1, 3, 1);
histogram(results_attempts, 100, 'FaceColor', '#0072BD', 'EdgeColor', 'none');
xline(mean_attempts, 'r', 'LineWidth', 2, 'Label', '평균');
xline(median_attempts, 'g', 'LineWidth', 2, 'Label', '상위 50%');
title('+12 도달 누적 시도 횟수');
xlabel('총 시도 횟수');
ylabel('빈도 (명)');
grid on;
% 2. 모순의 결정체 소모량 분포
subplot(1, 3, 2);
histogram(results_mosun, 100, 'FaceColor', '#D95319', 'EdgeColor', 'none');
xline(mean_mosun, 'r', 'LineWidth', 2, 'Label', '평균');
xline(median_mosun, 'g', 'LineWidth', 2, 'Label', '상위 50%');
title('+12 도달 모순 소모량');
xlabel('모순의 결정체 (개)');
grid on;
% 3. 누적 골드 소모량 분포
subplot(1, 3, 3);
histogram(results_gold, 100, 'FaceColor', '#EDB120', 'EdgeColor', 'none');
xline(mean_gold, 'r', 'LineWidth', 2, 'Label', '평균');
xline(median_gold, 'g', 'LineWidth', 2, 'Label', '상위 50%');
title('+12 도달 누적 골드 소모량');
xlabel('골드');
grid on;
end



--- +12 증폭 몬테카를로 시뮬레이션 10000000회 실행 중 ---
잠시만 기다려줘...

=== 시뮬레이션 완료 결과 ===
[누적 시도 횟수]
- 평균: 345.4회
- 상위 50% (중앙값): 242.0회
- 표준편차: 335.7회

[소모 재화 (모순의 결정체)]
- 평균: 2234.4개
- 상위 50% (중앙값): 1568.0개
- 표준편차: 2171.3개

[소모 재화 (골드)]
- 평균: 89374369 골드
- 상위 50% (중앙값): 62610240 골드
- 표준편차: 86841906 골드

[장비 보호권 소모량]
- 평균: 7.3장
- 상위 50% (중앙값): 5.0장
============================

재미로 Gemini 노동 시켜서 계산해봤어요. 모순 증폭은 저희가 알던

이런 형태의 가우시안 분포가 아니라서 평균값과 상위 50퍼센트 값이 따로 존재해요.


그래서 가끔 보면 모순 증폭이 이득인데? 하는 사람과 아닌데? 엄청 손해던데? 라는 사람들을 자주 볼 수 있어요.

위에까지가 안증을 1도하지않고 끝까지 모순증폭만 달린 결과에요.

아래는 +7증까지는 안전증폭 +8 부터는 모순증폭 결과에요



function dnf_monte_carlo_sim_hybrid(num_simulations)
% 실행 시 시뮬레이션 횟수를 지정하지 않으면 기본 10,000회 실행
clc;
if nargin < 1
num_simulations = 1e+6; % 테스트를 위해 기본 1만회 설정.
end
final_target_level = 12; % 최종 목표 증폭 수치
% =========================================================================
% --- [파트 1] 안전 증폭 규칙 세팅 (0 -> 7강) ---
% 사용자 제공 이미지 기반 '무기 외(방어구/악세/특장)' 소모량 적용
% =========================================================================
safe_target = 7;
% 단계별 조화의 결정체 비용 (0->1, 1->2, ..., 6->7)
harmonious_costs_safe = [16, 21, 26, 31, 46, 58, 98];
% 단계별 골드 비용 (0->1, 1->2, ..., 6->7)
gold_costs_safe = [189860, 250360, 310860, 371360, 490750, 615450, 1043132];
% 단계별 기본 성공 확률
probs_safe_base = [1.0, 1.0, 1.0, 1.0, 0.7, 0.6, 0.5];
% 단계별 실패 시 누적 보정 확률
safe_bonus = [0.0, 0.0, 0.0, 0.0, 0.10, 0.10, 0.10];
% =========================================================================
% --- [파트 2] 모순 증폭 규칙 세팅 (7 -> 12강) ---
% 기존 코드의 로직을 7강 이후 단계로 제한하여 사용
% =========================================================================
% 모순 비용 (7->8부터 시작)
original_costs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
mosun_costs_cont = original_costs(8:end); % [8, 9, 10, 11, 12]
% 모순 성공 확률 (7->8부터 시작)
original_probs = [1.0, 1.0, 1.0, 1.0, 0.8, 0.7, 0.6, 0.7, 0.6, 0.5, 0.4, 0.3];
probs_cont = original_probs(8:end); % [0.7, 0.6, 0.5, 0.4, 0.3]
% 모순 실패 시 하락 레벨 (7->8부터 시작)
original_fail_levels = [0, 1, 2, 3, 3, 4, 5, 4, 5, 6, 0, 0];
fail_levels_cont = original_fail_levels(8:end); % [4, 5, 6, 0, 0]
% 모순 증폭 시 고정 골드 비용
gold_per_mosun_attempt = 258720;
% =========================================================================
% 결과 저장 배열 초기화
% =========================================================================
results_attempts = zeros(num_simulations, 1);
results_harmonious = zeros(num_simulations, 1);
results_mosun = zeros(num_simulations, 1);
results_tickets = zeros(num_simulations, 1);
results_gold = zeros(num_simulations, 1);
fprintf('--- +0 -> +7(안전) -> +12(모순) 하이브리드 증폭 시뮬레이션 %d회 실행 중 ---\n', num_simulations);
fprintf('안전 증폭은 [무기 외] 규칙을 적용하며, 실패 시 보정치(%%p)를 누적합니다.\n');
fprintf('잠시만 기다려줘...\n');
% =========================================================================
% 몬테카를로 시뮬레이션 루프
% =========================================================================
for i = 1:num_simulations
current_level = 0;
attempts = 0;
harmonious = 0;
mosun = 0;
tickets = 0;
gold = 0;
safe_probs_modifier = 0;
while current_level < final_target_level
attempts = attempts + 1;
if current_level < safe_target
% [안전 증폭 구간: 0 -> 7강]
idx_safe = current_level + 1;
harmonious = harmonious + harmonious_costs_safe(idx_safe);
gold = gold + gold_costs_safe(idx_safe);
current_safe_prob = probs_safe_base(idx_safe) + safe_probs_modifier;
if current_safe_prob > 1.0
current_safe_prob = 1.0;
end
if rand() <= current_safe_prob
current_level = current_level + 1;
safe_probs_modifier = 0;
else
safe_probs_modifier = safe_probs_modifier + safe_bonus(idx_safe);
end
else
% [모순 증폭 구간: 7 -> 12강]
idx_cont = current_level - safe_target + 1;
mosun = mosun + mosun_costs_cont(idx_cont);
gold = gold + gold_per_mosun_attempt;
if rand() <= probs_cont(idx_cont)
current_level = current_level + 1;
else
if current_level >= 10
tickets = tickets + 1;
end
current_level = fail_levels_cont(idx_cont);
end
end
end
% 결과 기록
results_attempts(i) = attempts;
results_harmonious(i) = harmonious;
results_mosun(i) = mosun;
results_tickets(i) = tickets;
results_gold(i) = gold;
end
% =========================================================================
% --- 통계 계산 ---
% =========================================================================
mean_attempts = mean(results_attempts);
median_attempts = median(results_attempts);
std_attempts = std(results_attempts);
mean_harmonious = mean(results_harmonious);
median_harmonious = median(results_harmonious);
std_harmonious = std(results_harmonious);
mean_mosun = mean(results_mosun);
median_mosun = median(results_mosun);
std_mosun = std(results_mosun);
mean_gold = mean(results_gold);
median_gold = median(results_gold);
std_gold = std(results_gold);
mean_tickets = mean(results_tickets);
median_tickets = median(results_tickets);
% =========================================================================
% --- 텍스트 결과 출력 ---
% =========================================================================
fprintf('\n=== 시뮬레이션 완료 결과 (+0 -> +12 도달) ===\n');
fprintf('[누적 시도 횟수]\n');
fprintf(' - 평균: %.1f회\n', mean_attempts);
fprintf(' - 상위 50%% (중앙값): %.1f회\n', median_attempts);
fprintf(' - 표준편차: %.1f회\n', std_attempts);
fprintf('\n[소모 재화 (조화의 결정체) - 0~7강 안전 증폭]\n');
fprintf(' - 평균: %.1f개\n', mean_harmonious);
fprintf(' - 상위 50%% (중앙값): %.1f개\n', median_harmonious);
fprintf(' - 표준편차: %.1f개\n', std_harmonious);
fprintf('\n[소모 재화 (모순의 결정체) - 7~12강 모순 증폭]\n');
fprintf(' - 평균: %.1f개\n', mean_mosun);
fprintf(' - 상위 50%% (중앙값): %.1f개\n', median_mosun);
fprintf(' - 표준편차: %.1f개\n', std_mosun);
fprintf('\n[소모 재화 (골드)]\n');
fprintf(' - 평균: %.0f 골드\n', mean_gold);
fprintf(' - 상위 50%% (중앙값): %.0f 골드\n', median_gold);
fprintf(' - 표준편차: %.0f 골드\n', std_gold);
fprintf('\n[장비 보호권 소모량]\n');
fprintf(' - 평균: %.1f장\n', mean_tickets);
fprintf(' - 상위 50%% (중앙값): %.1f장\n', median_tickets);
fprintf('===========================================\n');
% =========================================================================
% --- 그래프 시각화 (4개 패널로 확장) ---
% =========================================================================
figure('Name', '하이브리드 증폭 시뮬레이션 결과 (무기 외)', 'Position', [100, 100, 1800, 450]);
% 1. 시도 횟수 분포
subplot(1, 4, 1);
histogram(results_attempts, 100, 'FaceColor', '#0072BD', 'EdgeColor', 'none');
xline(mean_attempts, 'r', 'LineWidth', 2, 'Label', '평균');
xline(median_attempts, 'g', 'LineWidth', 2, 'Label', '중앙값');
title('+12 도달 누적 시도 횟수');
xlabel('총 시도 횟수');
ylabel('빈도');
grid on;
% 2. 조화의 결정체 소모량 분포 (안전 증폭)
subplot(1, 4, 2);
histogram(results_harmonious, 100, 'FaceColor', '#7E2F8E', 'EdgeColor', 'none');
xline(mean_harmonious, 'r', 'LineWidth', 2, 'Label', '평균');
xline(median_harmonious, 'g', 'LineWidth', 2, 'Label', '중앙값');
title('조화 소모량 (0->7 안전)');
xlabel('조화의 결정체 (개)');
grid on;
% 3. 모순의 결정체 소모량 분포 (모순 증폭)
subplot(1, 4, 3);
histogram(results_mosun, 100, 'FaceColor', '#D95319', 'EdgeColor', 'none');
xline(mean_mosun, 'r', 'LineWidth', 2, 'Label', '평균');
xline(median_mosun, 'g', 'LineWidth', 2, 'Label', '중앙값');
title('모순 소모량 (7->12 모순)');
xlabel('모순의 결정체 (개)');
grid on;
% 4. 누적 골드 소모량 분포 (안전 + 모순 전체)
subplot(1, 4, 4);
histogram(results_gold, 100, 'FaceColor', '#EDB120', 'EdgeColor', 'none');
xline(mean_gold, 'r', 'LineWidth', 2, 'Label', '평균');
xline(median_gold, 'g', 'LineWidth', 2, 'Label', '중앙값');
title('+12 도달 누적 골드 소모량');
xlabel('골드');
grid on;
end

--- +0 -> +7(안전) -> +12(모순) 하이브리드 증폭 시뮬레이션 1000000회 실행 중 ---
안전 증폭은 [무기 외] 규칙을 적용하며, 실패 시 보정치(%p)를 누적합니다.
잠시만 기다려줘...

=== 시뮬레이션 완료 결과 (+0 -> +12 도달) ===
[누적 시도 횟수]
- 평균: 275.6회
- 상위 50% (중앙값): 194.0회
- 표준편차: 266.2회

[소모 재화 (조화의 결정체) - 0~7강 안전 증폭]
- 평균: 11763.0개
- 상위 50% (중앙값): 8232.0개
- 표준편차: 11523.7개

[소모 재화 (모순의 결정체) - 7~12강 모순 증폭]
- 평균: 865.8개
- 상위 50% (중앙값): 611.0개
- 표준편차: 830.3개

[소모 재화 (골드)]
- 평균: 150945207 골드
- 상위 50% (중앙값): 105808460 골드
- 표준편차: 147295532 골드

[장비 보호권 소모량]
- 평균: 7.3장
- 상위 50% (중앙값): 5.0장
===========================================




감사합니다.
2
!
  • Lv115
  • 재밌게겜해요
  • 진(眞) 마도학자 카인 루미아

    모험단Lv.41 여법만키워야지

일부 아바타는 게임과 다르게 노출될 수 있습니다.