LINUX.ORG.RU

История изменений

Исправление CrX, (текущая версия) :

ОК, я понял, что всё сложнее. Прям совсем на пальцах не получается, не придумал ничего лучше, чем использовать матрицу перехода.

Она у нас такая (состояние 0 — это один одинаковый бросок подряд, состояние 1 — два одинаковых броска подряд и т.д.)

{ 5/6  1/6    0    0 }
{ 5/6    0  1/6    0 }
{ 5/6    0    0  1/6 }
{   0    0    0    1 }

(Тяжко без LaTeX)…

Ну и вот её нам надо возвести в 1000 степень, точнее в 999, и взять вероятность перехода из состояния 0 в состояние 3 (четыре броска подряд).

#!/usr/bin/env python3
import numpy as np

matrix = np.array([
    [5/6, 1/6, 0, 0],
    [5/6, 0, 1/6, 0],
    [5/6, 0, 0, 1/6],
    [0, 0, 0, 1]
])

matrix_for_1000_rolls = np.linalg.matrix_power(matrix, 999)

probability_of_4_same = matrix_for_1000_rolls[0, 3]
print(probability_of_4_same)

Результат 0.9797612550208008, что совпадает с приближённым результатом симуляции:

#!/usr/bin/env python3
import random

def rolldice(rolls):
    sames = 0
    prev = None
    for _ in range(rolls):
        roll = random.randint(1, 6)
        if roll == prev:
            sames += 1
            if sames == 4:
                return True
        else:
            sames = 1
        prev = roll
    return False

probability = [rolldice(1000) for _ in range(1_000_000)].count(True) / 1_000_000
print(probability)

Результат: 0.979745


Особо упростить не получается. Может утром чего придумаю. Вообще надо было давно спать идти, а не в 3 часа ночи всякую фигню считать :D

Исправление CrX, :

ОК, я понял, что всё сложнее. Прям совсем на пальцах не получается, не придумал ничего лучше, чем использовать матрицу перехода.

Она у нас такая (состояние 0 — это один одинаковый бросок подряд, состояние 1 — два одинаковых броска подряд и т.д.)

{ 5/6  1/6    0    0 }
{ 5/6    0  1/6    0 }
{ 5/6    0    0  1/6 }
{   0    0    0    1 }

(Тяжко без LaTeX)…

Ну и вот её нам надо возвести в 1000 степень, точнее в 999, и взять вероятность перехода из состояния 0 в состояние 3 (четыре броска подряд).

#!/usr/bin/env python3
import numpy as np

matrix = np.array([
    [5/6, 1/6, 0, 0],
    [5/6, 0, 1/6, 0],
    [5/6, 0, 0, 1/6],
    [0, 0, 0, 1]
])

matrix_for_1000_rolls = np.linalg.matrix_power(matrix, 999)

probability_of_4_same = matrix_for_1000_rolls[0, 3]
print(probability_of_4_same)

Результат 0.9797612550208008, что совпадает с приближённым результатом симуляции:

#!/usr/bin/env python3
import random

def rolldice(rolls):
    sames = 0
    prev = None
    for _ in range(rolls):
        roll = random.randint(1, 6)
        if roll == prev:
            sames += 1
            if sames == 4:
                return True
        else:
            sames = 1
        prev = roll
    return False

probability = [rolldice(1000) for _ in range(1_000_000)].count(True) / 1_000_000
print(probability)

Результат: 0.979745

Исходная версия CrX, :

ОК, я понял, что всё сложнее. Прям совсем на пальцах не получается, не придумал ничего лучше, чем использовать матрицу перехода.

Она у нас такая (состояние 0 — это один одинаковый бросок подряд, состояние 1 — два одинаковых броска подряд и т.д.)

{ 5/6  1/6    0    0 }
{ 5/6    0  1/6    0 }
{ 5/6    0    0  1/6 }
{   0    0    0    1 }

(Тяжко без LaTeX)…

Ну и вот её нам надо возвести в 1000 степень и взять вероятность перехода из состояния 0 в состояние 3 (четыре броска подряд).

#!/usr/bin/env python3
import numpy as np

matrix = np.array([
    [5/6, 1/6, 0, 0],
    [5/6, 0, 1/6, 0],
    [5/6, 0, 0, 1/6],
    [0, 0, 0, 1]
])

matrix_for_1000_rolls = np.linalg.matrix_power(matrix, 1000)

probability_of_4_same = matrix_for_1000_rolls[0, 3]
print(probability_of_4_same)

Результат 0.9798402581724386, что совпадает с приближённым результатом симуляции:

#!/usr/bin/env python3
import random

def rolldice(rolls):
    sames = 0
    prev = None
    for _ in range(rolls):
        roll = random.randint(1, 6)
        if roll == prev:
            sames += 1
            if sames == 4:
                return True
        else:
            sames = 1
        prev = roll
    return False

probability = [rolldice(1000) for _ in range(1_000_000)].count(True) / 1_000_000
print(probability)

Результат: 0.979745