История изменений
Исправление 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