19-10-2019, 13:21 | #1 |
Hungmung Reputacja: 1 | 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. |
19-10-2019, 15:34 | #2 |
Reputacja: 1 | 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. |
19-10-2019, 19:01 | #3 |
Hungmung Reputacja: 1 | 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. 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! |
21-10-2019, 13:24 | #5 |
Hungmung Reputacja: 1 | 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. Na Repl.it znalezienie szansy na dany wynik w 100 rzutach D100 zajmuje jej trochę ponad 35 sekund. Motzne... |