ダイスはキャストされます

\(5\)等しい数はトリックになります。ただし、これがどの程度の可能性があるかは、何を試行としてカウントするかによって異なります。 \(5\)個のサイコロを 1 回振るか、サイコロを合わせ続けて最大\(2\)回振り直す完全なターンです。ここでは\(1\)から\(6\)までの数字と独立した結果を持つ\(5\)公平なサイコロを使用します。すべてのトリックは成功とみなされます。求めている確率は\(6\)のような特定の点数に限定されません。


ゲームの指示に従って、追加のロールを行う前に、どのダイスを置いておくかを再度決定できます。私たちの唯一の目標は何らかのトリックであり、ゲームの総合スコアを最高にすることではありません。サイコロを区別すると、単一のロールの結果は\(6^5=7776\)と同じ確率になります。このうち\(6\)すべてのサイコロで同じ数字を示します。したがって、確率は\(\frac{6}{7776}=\frac{1}{1296}\)です。トリックに達したらすぐに動きを終了します。合計で、最大\(3\)のスローが許可されます。

$$p_1=\frac{6}{6^5}=\frac{1}{1296}\approx0{,}07716\%.$$

最も単純な戦略も最善です。チャンスを最大限に高めたい場合は、同じ数字の最大グループを維持します。ターゲットの数値も変更することができます。 \((2,2,3,4,5)\)から、まず 2 つの\(2\)を保持します。次のロールで\((6,6,6)\)が出た場合は、このグループを保持し、2 つの\(2\)を再ロールします。最後のチャンスは\(\frac{1}{216}\)から\(\frac{1}{36}\)に増加します。最後になりましたが、次のことを仮定してみましょう。ギミックによってエピソードはすぐに終了します。それ以上の子は省略されます。

計算を行う最も簡単な方法は、最後のスローから開始することです。同じサイコロの\(4\)がすでに利用可能な場合、残りのサイコロのみが通過する必要があります。確率は\(\frac{1}{6}\)です。 \(3\)が同じサイコロの場合、他の 2 つは持っている数字を表示する必要があります。結果は独立しているため、確率を乗算して\(\frac{1}{6}\cdot\frac{1}{6}=\frac{1}{36}\)を求めます。逆に、異なる数字を同時にホールドしていれば、最後の投げは問題ありません。したがって、数字だけではなく、何を保持するかも重要です。

\(2\)ロールが残っているので、欠けているサイコロにはもう一度チャンスが与えられます。 \(4\)個のサイコロが同じ場合、残りのサイコロで 1 回ヒットするだけで十分です。ここではカウンターの計算が短くなります。彼は両方の試行でターゲットの数字をミスする確率が\(\frac{5}{6}\cdot\frac{5}{6}=\frac{25}{36}\) 。したがって、成功の確率は\(1-\frac{25}{36}=\frac{11}{36}\)となります。小規模なグループの場合は、投げた結果の可能性をすべて計算し、ターゲットを変更することを許可します。最適なストップの選択により、次のチャンスが発生します:

最大のグループ結果は\(1.\)産子になります残りのロールが\(2\)のチャンス
\(1\)\(720\)\(\frac{221}{17496}\)
\(2\)\(5400\)\(\frac{113}{3888}\)
\(3\)\(1500\)\(\frac{121}{1296}\)
\(4\)\(150\)\(\frac{11}{36}\)
\(5\)\(6\)\(1\)

線は同じ頻度で発生するわけではありません。たとえば、 \(2\)のサイコロの最大のグループは、最初に投げられる\(7776\)回のうち\(5400\)に作成されます。これらには、単一のペアと\(2\)ペアが含まれます。同点の場合は、その中から 1 つを選択します。右側の各確率に中央の数値を掛け、その合計を\(7776\)で割ります。これは\(p_3\)を返します。 \(p_2\)の場合は、剰余スローのみを使用します。次の値は、最適な停止選択による最初のスローの前に適用されます: 最大\(2\)のスローの場合は\(p_2\) 、最大\(3\)のスローの場合は\(p_3\):

$$p_2=\frac{221}{17496}\approx1{,}26315\%.$$

$$p_3=\frac{347897}{7558272}\approx4{,}60286425\%.$$

最大のグループを維持することが本当に最善であるかどうかは、十分にテストできます。次の PHP スクリプトでは、帯分数やサイコロをまったく持たないなど、考えられるすべての選択が考慮されます。ターンの終了時に開始され、残りの\(1\)と\(2\)の出目について最良の決定が計算され、最後に最初の出目の平均値が計算されます。請求額を抑えるために同じパターンを再利用します。すべての比較は整数を使用して行われます。パーセンテージ表示のみ四捨五入されます:

<?php

declare(strict_types=1);

if (PHP_INT_SIZE < 8) {
    throw new RuntimeException('64-Bit-PHP erforderlich.');
}

function combinations(array $limits): array
{
    $result = [[]];
    foreach ($limits as $limit) {
        $next = [];
        foreach ($result as $prefix) {
            for ($i = 0; $i <= $limit; $i++) {
                $next[] = [...$prefix, $i];
            }
        }
        $result = $next;
    }
    return $result;
}

function outcomes(int $number): array
{
    static $cache = [];
    if (isset($cache[$number])) {
        return $cache[$number];
    }
    $result = [];
    foreach (combinations(array_fill(0, $number, value: 5)) as $dice) {
        $counts = array_fill(0, count: 6, value: 0);
        foreach ($dice as $face) {
            $counts[$face]++;
        }
        $key = implode(',', $counts);
        $result[$key] = ($result[$key] ?? 0) + 1;
    }
    return $cache[$number] = $result;
}

function pattern(array $counts): string
{
    rsort($counts);
    return implode(',', $counts);
}

$states = [];
$values = [];
foreach (outcomes(5) as $key => $count) {
    $counts = array_map('intval', explode(',', $key));
    rsort($counts);
    $states[pattern($counts)] = $counts;
    $values[pattern($counts)] = (int) ($counts[0] === 5);
}

// Gemeinsamer Nenner: 6^(5 * verbleibende Würfe).
for ($remaining = 1; $remaining <= 2; $remaining++) {
    $next = [];
    foreach ($states as $key => $counts) {
        $best = 0;
        foreach (combinations($counts) as $held) {
            $number = 5 - array_sum($held);
            $total = 0;
            foreach (outcomes($number) as $rolled => $count) {
                $after = array_map('intval', explode(',', $rolled));
                foreach ($held as $face => $amount) {
                    $after[$face] += $amount;
                }
                $total += $count * $values[pattern($after)];
            }
            $best = max($best, $total * (6 ** (5 - $number)));
        }
        $next[$key] = $best;
    }
    $values = $next;
}

$numerator = 0;
$denominator = 6 ** 15;
foreach (outcomes(5) as $key => $count) {
    $numerator += $count * $values[pattern(array_map('intval', explode(',', $key)))];
}
[$a, $b] = [$numerator, $denominator];
while ($b !== 0) {
    [$a, $b] = [$b, $a % $b];
}
echo intdiv($numerator, $a), '/', intdiv($denominator, $a), PHP_EOL;
printf("%.10f%%\n", (100 * $numerator) / $denominator);

\(4{,}60\%\)付近は、次のことを意味します。最適な選択を行ったとしても、問題が発生することはまれです。毎回すべてを再ロールすると、最大\(3\)回の試行が成功する確率は\(0{,}23130\%\)程度です。サイコロを合わせ続け、 \(1.\)ロール後に選択した目標の数字を守り続ければ、 \(4{,}52941\%\)程度の目標を達成できるでしょう。したがって、より大きなグループに切り替えると、さらに小さな利点が得られます。それが数学的な戦略であれ、純粋な直感であれ、Kniffel は時代を超えた、面白く、そして何よりも楽しいボード ゲームです。

バック