Жертва кинута

\(5\) рівних чисел призводить до трюку. Однак наскільки це ймовірно, залежить від того, що ви вважаєте спробою: один кидок \(5\) кубиків або повний хід, під час якого ви продовжуєте зіставляти кубики та повторно кидаєте їх до \(2\) разів. Тут ми використовуємо \(5\) чесних кубиків із числами \(1\) до \(6\) і незалежними результатами. Кожен трюк вважається успіхом; ймовірність, яку ви шукаєте, не обмежується певною кількістю балів, наприклад \(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\) . Якщо наступний кидок приносить \((6,6,6)\) , ви зберігаєте цю групу та повторно кидаєте два \(2\) . Останній шанс збільшується з \(\frac{1}{216}\) до \(\frac{1}{36}\) . І останнє, але не менш важливе, припустімо: трюк негайно завершує епізод; подальші посліди опущені.

Найпростіший спосіб зробити розрахунок - почати з останнього кидка. Якщо \(4\) тих самих кубиків уже доступні, потрібно пройти лише кубики, що залишилися: шанс \(\frac{1}{6}\) . Якщо \(3\) є однаковими кубиками, два інших повинні показувати число, яке є. Оскільки їхні результати незалежні, помножте шанси й отримайте \(\frac{1}{6}\cdot\frac{1}{6}=\frac{1}{36}\) . З іншого боку, якщо ви тримаєте різні номери одночасно, не може бути проблем з останнім кидком. Тож важлива не лише кількість, а й те, що ви зберігаєте.

Коли залишилося кинути \(2\) , кожен пропущений кубик отримує ще один шанс. Якщо \(4\) кубиків однакові, достатньо одного удару рештою кубиків. Розрахунок лічильника тут коротший: він пропускає цільове число в обох спробах з імовірністю \(\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\) кубиків створюється в \(5400\) з \(7776\) можливих перших кидків. До них належать одна пара та \(2\) пари; Якщо є нічия, ви обираєте одну з них. Ми множимо кожен шанс праворуч на число в середині та ділимо суму на \(7776\) . Це повертає \(p_3\) ; для \(p_2\) ви використовуєте лише кидок залишку. Наступні значення застосовуються до першого кидка з оптимальним вибором зупинки: \(p_2\) для максимум \(2\) і \(p_3\) для максимум \(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 — це вічна, розважальна і, перш за все, розважальна настільна гра.

Назад