Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in 3rd party category for Expected Dice by _Chico_
import random
import numpy as np
from collections import defaultdict
def expected(dice_number, sides, target, board):
first_distribution = {}
for i in range(len(board)):
first_distribution[i] = 0.
first_distribution[0] = 1.
distribution = [first_distribution]
dices = np.zeros((sides,)*dice_number, dtype=int)
it = np.nditer(dices, flags=['multi_index'])
while not it.finished:
dices[it.multi_index] = np.sum(it.multi_index) + dice_number
it.iternext()
unique, counts = np.unique(dices.flatten(), return_counts=True)
advances = dict(zip(unique, counts))
total = sum(advances.values())
for i in advances.keys():
advances[i] /= total
def expand():
last_distribution = distribution[-1]
next_distribution = {}
for i in range(len(board)):
next_distribution[i] = 0.
for i in last_distribution.keys():
if i != target or len(distribution) == 1:
for j in advances.keys():
stop = (i+j) % len(board)
while board[stop]:
stop += board[stop]
stop = stop % len(board)
# next_distribution[stop] += last_distribution[i]*advances[j]/(sum(last_distribution.values())-last_distribution[target])
next_distribution[stop] += last_distribution[i]*advances[j]
distribution.append(next_distribution)
for i in range(1000):
expand()
expected = 0.
for i in range(len(distribution)):
expected += i*distribution[i][target]
return expected
May 18, 2021