情報処理技術者試験 高度区分 午前1・2問題 突破確率計算

Run Settings
LanguageJava
Language Version
Run Command
import java.util.Random; /** * IPA高度区分試験(午前1、午前2)の合格確率をモンテカルロシミュレーションで計算するシミュレーター。 * 各試験区分と解答方式(4択、3択、2択)に応じて合格率を算出します。 */ public class IpaKoudoAmSimulator { // 定数定義 private static final int DEFAULT_TRIALS = 100000; // 各シナリオでのデフォルト試行回数 /** * IPA高度区分試験の種類を定義する列挙型。 * 各試験の総問題数と合格に必要な正解数を保持します。 */ public enum ExamType { ADVANCED_EXAM_AM1("高度区分 午前1問題", 30, 18), ADVANCED_EXAM_AM2("高度区分 午前2問題", 25, 15); private final String name; private final int totalQuestions; private final int passingScore; ExamType(String name, int totalQuestions, int passingScore) { this.name = name; this.totalQuestions = totalQuestions; this.passingScore = passingScore; } public String getName() { return name; } public int getTotalQuestions() { return totalQuestions; } public int getPassingScore() { return passingScore; } } /** * 解答方式を定義する列挙型。 * 各方式の正答率を保持します。 */ public enum AnswerMethod { FOUR_CHOICES("4択問題", 4), THREE_CHOICES("3択問題 (1つ除外)", 3), TWO_CHOICES("2択問題 (2つ除外)", 2); private final String name; private final int totalChoices; // 選択肢の数 AnswerMethod(String name, int totalChoices) { this.name = name; this.totalChoices = totalChoices; } public String getName() { return name; } public int getTotalChoices() { return totalChoices; } } /** * シミュレーション結果を保持するレコード。 * (Java 16 以降で利用可能なレコード型を使用しています。古いJavaバージョンの場合は通常のクラスに変換してください) */ public record SimulationResult(int knownCorrectQuestions, double successRate) {} private final Random random; /** * IpaKoudoAmSimulatorの新しいインスタンスを生成します。 */ public IpaKoudoAmSimulator() { this.random = new Random(); } /** * 指定されたシナリオでモンテカルロシミュレーションを実行し、合格確率を計算します。 * * @param examType シミュレーション対象の試験タイプ * @param answerMethod シミュレーション対象の解答方式 * @param knownCorrectQuestions 事前に知っている正解数 * @param trials 試行回数 * @return シミュレーション結果を表す {@code SimulationResult} オブジェクト * @throws IllegalArgumentException 不正な引数が指定された場合 */ public SimulationResult simulateScenario(ExamType examType, AnswerMethod answerMethod, int knownCorrectQuestions, int trials) { if (knownCorrectQuestions < 0 || knownCorrectQuestions > examType.getTotalQuestions()) { throw new IllegalArgumentException( "事前に知っている正解数 (" + knownCorrectQuestions + ") は、0から総問題数 (" + examType.getTotalQuestions() + ") の範囲で指定してください。" ); } if (trials <= 0) { throw new IllegalArgumentException("試行回数は1以上を指定してください。"); } int totalQuestions = examType.getTotalQuestions(); int passingScore = examType.getPassingScore(); int successfulTrials = 0; // 知っている問題以外の解答に必要な問題数と正解数 int remainingQuestions = totalQuestions - knownCorrectQuestions; int requiredCorrectForPassing = passingScore - knownCorrectQuestions; // 事前知識だけで合否が確定する場合の早期リターン if (requiredCorrectForPassing <= 0) { return new SimulationResult(knownCorrectQuestions, 100.00); // 確実に合格 } if (requiredCorrectForPassing > remainingQuestions) { return new SimulationResult(knownCorrectQuestions, 0.00); // 合格不可能 } for (int i = 0; i < trials; i++) { int guessedCorrect = 0; for (int j = 0; j < remainingQuestions; j++) { // 解答方式に応じた確率で正解をシミュレート if (random.nextInt(answerMethod.getTotalChoices()) == 0) { guessedCorrect++; } } if (guessedCorrect >= requiredCorrectForPassing) { successfulTrials++; } } double successRate = (double) successfulTrials / trials * 100; return new SimulationResult(knownCorrectQuestions, successRate); } /** * シミュレーション結果を表示します。 * * @param result 表示するシミュレーション結果 */ public void displayResult(SimulationResult result) { System.out.printf("・事前に%d問知っている場合: 合格率: %.2f%%\n", result.knownCorrectQuestions(), result.successRate()); } /** * メインメソッド。各種IPA高度区分試験のシミュレーションを実行します。 */ public static void main(String[] args) { IpaKoudoAmSimulator simulator = new IpaKoudoAmSimulator(); System.out.println("★IPA高度区分マーク試験突破確率計算:ランダム選択方式(モンテカルロシミュレーション)★"); System.out.println(); // 空行を追加して見やすく // 各試験タイプと解答方式の組み合わせでシミュレーションを実行 for (ExamType examType : ExamType.values()) { System.out.println("---"); System.out.println("■" + examType.getName() + " (総問題数: " + examType.getTotalQuestions() + "問, 合格に必要な正解数: " + examType.getPassingScore() + "問)"); System.out.println("---"); for (AnswerMethod answerMethod : AnswerMethod.values()) { System.out.println(" ◇ " + answerMethod.getName() + " 試行結果"); // シミュレーション対象の knownCorrectQuestions の範囲を合格点までにする for (int i = 0; i <= examType.getPassingScore(); i++) { try { SimulationResult result = simulator.simulateScenario(examType, answerMethod, i, DEFAULT_TRIALS); simulator.displayResult(result); } catch (IllegalArgumentException e) { System.err.println("エラー: " + e.getMessage()); } } System.out.println(); // 各解答方式の後に空行 } } System.out.println("---"); } }
Editor Settings
Theme
Key bindings
Full width
Lines