がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

「オリエンタル霊異譚 幽冥鬼使」の確率計算

数学苦手なんで(……とも言ってられないんだが)、馬力で計算してみたw

厳密には「3以上の時は技能値(等)が足される」ので、その辺で少し加減されるんだけど。
いったん「ダイス目だけ」で、陰徳値無考慮で純粋に「ダイスの確率」で確認。
プログラムでざっくり書いてるんで端数誤差あるんだけど、その辺は気にせずに。

0 27.777778%
3 4.320988%
4 4.783951%
5 8.641975%
6 9.567901%
7 12.962963%
8 10.030864%
9 8.641975%
10 6.17284%
11 4.320988%
12 2.314815%
20 0.462963%

「n値以上」だと、こんな感じ。

0以上 100%
3以上 72.222223%
4以上 67.901235%
5以上 63.117284%
6以上 54.475309%
7以上 44.907408%
8以上 31.944445%
9以上 21.913581%
10以上 13.271606%
11以上 7.098766%
12以上 2.777778%
20以上 0.462963%

ここの判定と比較的近似と思われる、2d6の分布は大体こんな感じ。

2 2.78%
3 5.56%
4 8.33%
5 11.11%
6 13.89%
7 16.67%
8 13.89%
9 11.11%
10 8.33%
11 5.56%
12 2.78%

2 100.00%
3 97.22%
4 91.67%
5 83.33%
6 72.22%
7 58.33%
8 41.67%
9 27.78%
10 16.67%
11 8.33%
12 2.78%

比較っぽい表にすると、こんな感じ。

0 - 100%
2 100.00% -
3 97.22% 72.222223%
4 91.67% 67.901235%
5 83.33% 63.117284%
6 72.22% 54.475309%
7 58.33% 44.907408%
8 41.67% 31.944445%
9 27.78% 21.913581%
10 16.67% 13.271606%
11 8.33% 7.098766%
12 2.78% 2.777778%
20 - 0.462963%

一概には言いにくいんだけど、中程度の難易度を想定するときは「平目で、2d6の時より1くらい値を下げておく」をベースにすると、割と、近似するんじゃなかろうか? と。

なお、コード(デバッグ出力があちこちあんのは気にすんな)。

<?php

// 元ネタ
$base = [];
for($i = 1; $i <= 6; ++$i) {
    for($j = 1; $j <= 6; ++$j) {
        for($k = 1; $k <= 6; ++$k) {
            for($l = 1; $l <= 6; ++$l) {
                $base["{$i},{$j},{$k},{$l}"] = [$i, $j, $k, $l];
            }
        }
    }
}
// var_dump($base);

// 確認
$data = [];
foreach($base as $k => $v) {
    // いったん、サイコロの目をsort
    sort($v);
    
    // 先にクリティカル確認
    if ( ($v[0] === $v[1])&&($v[1] === $v[2])&&($v[2] === $v[3]) ) {
        echo "クリット: {$k}\n";
        $data[20] ??= 0;
        $data[20] ++;
        continue;
    }
    // 失敗を算出
    if ( ($v[0] != $v[1])&&($v[1] !== $v[2])&&($v[2] !== $v[3]) ) {
        echo "ファンブル: {$k}\n";
        $data[0] ??= 0;
        $data[0] ++;
        continue;
    }
    // 通常成功を算出(面倒だから馬力)
    if ( ($v[0] === $v[1]) ) {
        $key = $v[2] + $v[3];
        echo "{$k} => {$v[2]} + {$v[3]} = {$key} \n";
    } elseif (($v[1] === $v[2])) {
        $key = $v[0] + $v[3];
        echo "{$k} => {$v[0]} + {$v[3]} = {$key} \n";
    } elseif (($v[2] === $v[3])) {
        $key = $v[0] + $v[1];
        echo "{$k} => {$v[0]} + {$v[1]} = {$key} \n";
    }
    //
    $data[$key] ??= 0;
    $data[$key] ++;
}
//var_dump($data);

// sortして
ksort($data);
// 合計値出して
$total = array_sum($data);
// 各値の確率を出力
foreach($data as $k => $v) {
    printf("%d: %f%% \n", $k, $v/$total*100);
}