Spis Stron RPG Regulamin Wieści POMOC Kalendarz
Wróć   lastinn > Rozmowy przy kawce > Lastinn'owy hydepark > Archiwum hydeparku
Zarejestruj się Użytkownicy


Zamknięty Temat
 
Narzędzia wątku Wygląd
Stary 19-10-2019, 13:21   #1
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ę
Dużo kości, dużo oczek, dużo liczenia

Pytanie do osób zaznajomionych z prawdopodobieństwem.

Jest sobie funkcja, która liczy szansę wystąpienia danej sumy oczek przy n-rzutach kostką k-ścienną. Ma jednak pewną wadę. Żeby policzyć tę szansę sprawdza każdy wynik, a następnie dzieli liczbę sukcesów przez liczbę wszystkich możliwych kombinacji.

Takie liczenie ma sens przy małych liczbach. Np. 2 rzuty D6 i sukcesie przy sumie 3 oczek. Wyszukujemy sumy 3 w 36 (6^2) wynikach- występuje 2 razy. BAM! 2/36 lub w przybliżeniu 5,56% szans na sukces. Proste.
Niestety kiedy mamy do przeliczenia 10 rzutów D10 i sukcesie przy sumie 50, funkcja musi sprawdzić 10 000 000 000 (10^10) kombinacji. I liczy dłuugooo...

Czy jest sposób/wzór, by wyliczyć ile kombinacji daje sukces bez uciekania się do sprawdzania wszystkich wyników?
Przeszukując sieć wpadłem na coś takiego. Jednak tu też trzeba coś podstawić pod liczbę sukcesów, co wydaje się trudne jeżeli bierzemy pod uwagę sumę oczek.
 
Dust Mephit jest offline  
Stary 19-10-2019, 15:34   #2
 
TomBurgle's Avatar
 
Reputacja: 1 TomBurgle ma wspaniałą reputacjęTomBurgle ma wspaniałą reputacjęTomBurgle ma wspaniałą reputacjęTomBurgle ma wspaniałą reputacjęTomBurgle ma wspaniałą reputacjęTomBurgle ma wspaniałą reputacjęTomBurgle ma wspaniałą reputacjęTomBurgle ma wspaniałą reputacjęTomBurgle ma wspaniałą reputacjęTomBurgle ma wspaniałą reputacjęTomBurgle ma wspaniałą reputację
Polecam trolla. Troll dice roller and probability calculator
Dla dużych liczb (rzuty dla WoDa z 10+ kośćmi, przerzutami i ujemnymi sukcesami troll sobie nie radzi) faktycznie trzeba zrobić to samemu.

Poprawnie: nie potrzebujesz liczba ścianek^liczba kości kombinacji - nie ma dla Ciebie znaczenia kolejność wyników, a jedynie suma oczek (permutacja z powtórzeniami). To powinno mocno zmniejszyć czas wykonywania obliczenia. Weź w ręce Pythona i pakiet iterools i pójdzie gładko.
Uproszczone, ale wygodne: jeżeli nie zależy ci na dużej precyzji, możesz stworzyć sobie rozkład normalny.
Parametry:
wartość oczekiwana = średni wynik z 1d6(3,5) * liczba kości
odchylenie standardowe = takie samo jak dla fikcyjnej próbki gdzie będziesz miał po równo 1,2,3,4,5,6 czyli łatwo sobie spreparujesz w excelu (dla 1d6 wychodzi pierwiastek z (liczba kości*35/12))
I zwyczajnie odczytujesz prawdopodobieństwo uzyskania wyniku większego niż żądany np. w wolframie
 
__________________
W styczniu '22 zakończyłem korzystanie z tego forum - dzięki!

Ostatnio edytowane przez TomBurgle : 19-10-2019 o 18:36.
TomBurgle jest offline  
Stary 19-10-2019, 19:01   #3
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  
Stary 20-10-2019, 13:30   #4
 
Lord Cluttermonkey's Avatar
 
Reputacja: 1 Lord Cluttermonkey ma wspaniałą reputacjęLord Cluttermonkey ma wspaniałą reputacjęLord Cluttermonkey ma wspaniałą reputacjęLord Cluttermonkey ma wspaniałą reputacjęLord Cluttermonkey ma wspaniałą reputacjęLord Cluttermonkey ma wspaniałą reputacjęLord Cluttermonkey ma wspaniałą reputacjęLord Cluttermonkey ma wspaniałą reputacjęLord Cluttermonkey ma wspaniałą reputacjęLord Cluttermonkey ma wspaniałą reputacjęLord Cluttermonkey ma wspaniałą reputację
Czy to nie jest przypadkiem funkcja =BINOM.DIST w MS Excel, czyli rozkład dwumianowy?

Ja zwykle korzystam z AnyDice.
 

Ostatnio edytowane przez Lord Cluttermonkey : 20-10-2019 o 13:32.
Lord Cluttermonkey jest offline  
Stary 21-10-2019, 13:24   #5
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ę
Taki był mój pierwszy trop. Niemniej, wskazówka Toma o rozkładzie normalnym wydaje mi się dużo bliżej rozwiązania.

Przypadkiem znalazłem funkcję (szkoda, że nie moja), która w bardzo ciekawy sposób rozwiązuje problem. Zakłada 100% szansy w 1-elementowym zbiorze b = [1], po czym z każdym kolejnym rzutem rozszerza zbiór o liczbę ścianek i rozkłada tę szansę zgodnie z odchyleniem standardowym.


Kod:
def probability(dice_number, sides, target):
    a = [1/sides]*sides
    b = [1]
    for k in range(dice_number):
        b = [0]*sides + b + [0]*sides
        c = []
        for i in range(len(b)-sides):
            c.append(sum([a[j]*b[i+j] for j in range(sides)]))
        b = c
    if target >= len(b):
        return 0
    else:
        return b[target]



Na Repl.it znalezienie szansy na dany wynik w 100 rzutach D100 zajmuje jej trochÄ™ ponad 35 sekund. Motzne...
 
Dust Mephit jest offline  
Zamknięty Temat



Zasady Pisania Postów
Nie Możesz wysyłać nowe wątki
Nie Możesz wysyłać odpowiedzi
Nie Możesz wysyłać załączniki
Nie Możesz edytować swoje posty

vB code jest WÅ‚.
Uśmieszki są Wł.
kod [IMG] jest WÅ‚.
kod HTML jest Wył.
Trackbacks jest Wył.
Pingbacks sÄ… WÅ‚.
Refbacks are Wył.


Czasy w strefie GMT +2. Teraz jest 16:40.



Powered by: vBulletin Version 3.6.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.1.0
Pozycjonowanie stron | polecanki
Free online flash Mario Bros -Mario games site

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172