\(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 は時代を超えた、面白く、そして何よりも楽しいボード ゲームです。