チバリヨ2シミュレータ JSコード

JavaScriptで書いたチバリヨ2の虹パト〜リミットレスモード終了までの獲得枚数シミュレータです。

虹パトから開始時
平均ボーナス回数:21.23回(ループ率:約94.24%)
平均合計獲得枚数:4935.76枚

有利区間切りからツラヌキ発動時
平均ボーナス回数:14.40回(ループ率:約93.1%)
平均合計獲得枚数:3352.97枚

// 状態
const STATE_A = "A";
const STATE_B = "B";
const STATE_END = "END";

// 獲得個数
const PRIZE_COUNT_SBIG = 315;
const PRIZE_COUNT_BIG = 210;
const PRIZE_COUNT_REG = 90;

// 状態遷移確率
const PROB_A_TO_B_FAIL = 0.08;
const PROB_B_UP = 0.15;
const PROB_B_END = 0.12;

// 獲得個数確率
const PROB_PRIZE_COUNT_SBIG = 0.5;
const PROB_PRIZE_COUNT_BIG = 0.25;
const PROB_PRIZE_COUNT_REG = 0.25;

// シミュレーション回数
const SIMULATION_COUNT = 10000;

// 定数
const MAX_PRIZE_PER_YURI = 2000;
const MAX_PRIZE_PER_DRAW = 19000;

// シミュレーション実行
function simulate() {
  let totalDraws = 0;
  let totalPrizeCount = 0;
  for (let i = 0; i < SIMULATION_COUNT; i++) {
    let state = STATE_A;
    let totalPrize = 0;
    let totalPrizeYuri = 0;
    let draws = 0;
    while (true) {
      draws++;

      // 状態遷移
      state = transitionState(state);

      // 獲得枚数
      const prizeCount = getPrizeCount();
      totalPrize += prizeCount;
      totalPrizeYuri += prizeCount;

      // 有利区間終了条件枚数を超えたら有利区間を切り状態Bへ移行
      if (totalPrizeYuri >= MAX_PRIZE_PER_YURI) {
        state = STATE_B;
        totalPrizeYuri=0;
      }

      // 終了状態かコンプリートしたら終了
      if (state === STATE_END || totalPrize >= MAX_PRIZE_PER_DRAW) {
        break;
      }
    }
    totalDraws += draws;
    totalPrizeCount += totalPrize;
  }

  // 平均計算
  const averageDraws = totalDraws / SIMULATION_COUNT;
  const averagePrizeCount = totalPrizeCount / SIMULATION_COUNT;

  // 結果出力
  console.log(`平均抽選回数:${averageDraws.toFixed(2)}回`);
  console.log(`平均合計獲得枚数:${averagePrizeCount.toFixed(2)}枚`);
}

// 状態遷移処理
function transitionState(state) {
  if (state === STATE_A) {
    if (Math.random() < PROB_A_TO_B_FAIL) {
      return STATE_B;
    }
  } else if (state === STATE_B) {
    const rand = Math.random();
    if (rand < PROB_B_UP) {
      return STATE_A;
    } else if (rand < PROB_B_UP + PROB_B_END) {
      return STATE_END;
    }
  }
  return state;
}

// 獲得個数取得
function getPrizeCount() {
  const rand = Math.random();
  if (rand < PROB_PRIZE_COUNT_SBIG) {
    return PRIZE_COUNT_SBIG;
  } else if (rand < PROB_PRIZE_COUNT_SBIG + PROB_PRIZE_COUNT_BIG) {
    return PRIZE_COUNT_BIG;
  } else {
    return PRIZE_COUNT_REG;
  }
}

// シミュレーション実行
simulate();

この記事が気に入ったらサポートをしてみませんか?