Wyświetl Pojedyńczy Post
Stary 19-10-2019, 18:01   #3
Dust Mephit
Hungmung
 
Dust Mephit's Avatar
 
Reputacja: 1 Dust Mephit ma wspaniałą reputacjęDust Mephit ma wspaniałą reputacjęDust Mephit ma wspaniałą reputacjęDust Mephit ma wspaniałą reputacjęDust Mephit ma wspaniałą reputacjęDust Mephit ma wspaniałą reputacjęDust Mephit ma wspaniałą reputacjęDust Mephit ma wspaniałą reputacjęDust Mephit ma wspaniałą reputacjęDust Mephit ma wspaniałą reputacjęDust Mephit ma wspaniałą reputację
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!
 
Dust Mephit jest offline