Troll dice... nie znałem. Stronka rzeczywiście bardzo przydatna.
Jeżeli chodzi o Pythona, to trafiłeś w sedno. Robiłem już kilka rozwiązań opartych o iterację po wynikach, ale wszystkie zamulają. W ostatnim podejściu funkcja opiera się o generator, ale i to nie pomogło.
Kod:
import itertools
def probability(dice_number, sides, target):
tar= 0
s = list(range(1,sides+1))
total_rolls = sides**dice_number
roll = [sum(i) for i in itertools.product(s, repeat=dice_number)]
def rolls(roll):
for i in roll:
yield i
for i in rolls(roll):
if i==target:
tar+=1
next(rolls(roll))
else:
next(rolls(roll))
if tar>0:
return round(tar/total_rolls, 4)
else: return 0.0000
Podejrzewam, że źle zastosowałem metodę .product. Wygląda na to, że wciąż iteruje po permutacjach, a potem sprowadza je do sumy.
Z tego co czytam o permutacjach z powtórzeniami to faktycznie powinna bardzo ograniczyć liczbę elementów do przetworzenia, i to chyba najlepsza droga.
Sprawdzę jeszcze drugą opcję, bo wygląda naprawdę elegancko i przy okazji dokształcę się ze statystyki.
Wielkie dzięki za pomoc!