Jak łatwo określić rozkład wyników dla wielu kości?


21

Chcę obliczyć rozkład prawdopodobieństwa dla sumy kombinacji kości.

Pamiętam, że prawdopodobieństwo jest liczbą kombinacji, które sumują tę liczbę w stosunku do całkowitej liczby kombinacji (zakładając, że kości mają równomierny rozkład).

Jakie są formuły

  • Łączna liczba kombinacji
  • Liczba kombinacji, które sumują określoną liczbę

1
Myślę, że powinieneś traktować (X1=1,X2=2) i (X1=2,X2=1) jako różne zdarzenia.
Deep North

Odpowiedzi:


15

Dokładne rozwiązania

Liczba kombinacji w n generuje jest oczywiście 6n .

Obliczeń tych najłatwiej wykonać za pomocą funkcji generowania prawdopodobieństwa dla jednej kości,

p(x)=x+x2+x3+x4+x5+x6=x1x61x.

(W rzeczywistości jest to 6 krotność pgf - na końcu zajmę się współczynnikiem 6 ).

Pgf dla n rolek to p(x)n . Możemy to obliczyć dość bezpośrednio - nie jest to forma zamknięta, ale jest przydatna - używając twierdzenia dwumianowego:

p(x)n=xn(1x6)n(1x)n

=xn(k=0n(nk)(1)kx6k)(j=0(nj)(1)jxj).

Liczba sposobów uzyskania sumy równej m na kostkach to współczynnik xm tym produkcie, który możemy wyodrębnić jako

6k+j=mn(nk)(nj)(1)k+j.

Suma jest sumą wszystkich nieujemnych wartości k i j dla których 6k+j=mn ; dlatego jest skończony i ma tylko około (mn)/6 terminów. Na przykład, wiele sposobów, aby całkowita m=14 z n=3 rzuty jest sumą ciągu dwóch kategoriach, ponieważ 11=143 mogą być zapisane tylko 60+11 i 61+5 :

(30)(311)+(31)(35)

=1(3)(4)(13)11!+3(3)(4)(7)5!

=12)1213-3)2)67=15.

(Możesz także być sprytny i zauważyć, że odpowiedź będzie taka sama dla m=7 przy symetrii 1 <--> 6, 2 <--> 5 i 3 <--> 4 i jest tylko jeden sposób na rozwinięcie 7-3) jako 6k+jot ; mianowicie, przy k=0 i jot=4 , dając

(3)0)(-3)4)=15.

Prawdopodobieństwo wynosi zatem 15/63) = 5/36 , około 14%.

Do czasu, gdy staje się to bolesne, centralne twierdzenie graniczne zapewnia dobre przybliżenie (przynajmniej do warunków centralnych, gdzie m jest między 7n23n i7n2+3n : względnie, przybliżenia, jakie daje dla wartości ogona, stają się coraz gorsze, gdynrośnie.

Widzę, że ta formuła jest podana w artykule Wikipedii Referencje Srikant, ale nie podano żadnego uzasadnienia ani nie podano przykładów. Jeśli to podejście wydaje się zbyt abstrakcyjne, uruchom swój ulubiony system algebry komputerowej i poproś go o rozwinięcie nth potęgi x+x2++x6 : możesz od razu odczytać cały zestaw wartości. Np. Liner Mathematica jest

With[{n=3}, CoefficientList[Expand[(x + x^2 + x^3 + x^4 + x^5 + x^6)^n], x]]

Czy ten kod matematyczny będzie działał z wolfram alfa?

1
To działa. Wypróbowałem twoją wcześniejszą wersję, ale nie mogłem odczytać wyniku.

2
@Sikikant: Expand [Sum [x ^ i, {i, 1,6}] ^ 3] działa również w WolframAlpha

1
@ A.Wilson Uważam, że wiele z tych odniesień zapewnia wyraźną ścieżkę do uogólnienia, którym w tym przykładzie jest . Jeśli chcesz, aby kod obliczał te rzeczy, zobacz stats.stackexchange.com/a/116913, aby uzyskać w pełni zaimplementowany system. Jako kolejny przykład kod Mathematica to(x+x2++x6)(x+x2+x3+x4)3RClear[x, d]; d[n_, x_] := Sum[x^i, {i, 1, n}]; d[6, x] d[4, x]^3 // Expand
whuber

1
Zwróć uwagę, że wyjaśnienie @ whuber dotyczy 1d6 + 3d4 i to powinno cię tam doprowadzić. Dla dowolnego wdn + vdm, (x + x ^ 2 + ... + x ^ w) ^ n (x + x ^ 2 + ... + x ^ v) ^ m. Warunki dodatkowe to wielomiany konstruowane i mnożone z produktem w ten sam sposób.
A. Wilson

8

Jeszcze innym sposobem szybkiego obliczenia rozkładu prawdopodobieństwa rzutu kostką byłoby użycie specjalistycznego kalkulatora zaprojektowanego właśnie do tego celu.

Torben Mogensen , profesor CS w DIKU, ma doskonały wałek do kości o nazwie Troll .

Wałek do kości Troll i kalkulator prawdopodobieństwa drukuje rozkład prawdopodobieństwa (pmf, histogram i opcjonalnie cdf lub ccdf), średnią, rozrzut i średnie odchylenie dla różnych skomplikowanych mechanizmów rzucania kostką. Oto kilka przykładów, które pokazują język rzutów kostką Trolla:

Rolki 3 6-stronne kośćmi i zsumować je: sum 3d6.

Rolka 4 6-stronne kości, zachować najwyższą 3 i zsumować je: sum largest 3 4d6.

Toczyć się „eksploduje” 6-stronne kością (tj, za każdym razem „6” pojawia się, dodać 6 do łącznej and roll ponownie) sum (accumulate y:=d6 while y=6).

Kod źródłowy SML Troll jest dostępny, jeśli chcesz zobaczyć, jak został zaimplementowany.

Profesor Morgensen ma także 29-stronicowy artykuł zatytułowany „ Mechanizmy rzucania kostkami w grach RPG ”, w którym omawia wiele mechanizmów rzucania kostkami zaimplementowanych przez Trolla oraz niektóre matematykę za nimi stojącą.

Podobnym darmowym oprogramowaniem typu open source jest Dicelab , który działa zarówno w systemie Linux, jak i Windows.


7

Niech pierwsza kostka będzie czerwona, a druga czarna. Następnie jest 36 możliwych wyników:

12345611,11,21,31,41,51,623456722,12,22,32,42,52,634567833,13,23,33,43,53,645678944,14,24,34,44,54,6567891055,15,25,35,45,55,66789101166,16,26,36,46,56,6789101112

Każdy z tych 36 ( ) wyników jest jednakowo prawdopodobny.red,black

Gdy zsumujesz liczby na twarzach (suma na ), kilka wyników (czerwony, czarny) kończy się na tej samej sumie - możesz to zobaczyć w tabeli w swoim pytaniu.blue

Na przykład istnieje tylko jeden sposób na uzyskanie łącznie (tj. Tylko zdarzenie ( 1 , 1 )), ale są dwa sposoby na uzyskanie 3 (tj. Zdarzenia elementarne ( 2 , 1 ) i ( 1 , 2 )). Tak więc w sumie 3 jest dwa razy bardziej prawdopodobne niż 2 . Podobnie istnieją trzy sposoby uzyskania 4 , cztery sposoby uzyskania 5 i tak dalej.21,132,11,23245

Ponieważ masz 36 możliwych wyników (czerwony, czarny), łączna liczba sposobów uzyskania wszystkich różnych sum wynosi również 36, więc na końcu powinieneś podzielić przez 36. Twoje całkowite prawdopodobieństwo wyniesie 1, tak jak powinno być.


Wow, stół jest piękny!
Głęboka północ

Rzeczywiście bardzo ładna
wilki

6

Istnieje bardzo zgrabny sposób obliczania kombinacji lub prawdopodobieństw w arkuszu kalkulacyjnym (takim jak Excel), który oblicza bezpośrednio splot.

Zrobię to w kategoriach prawdopodobieństwa i zilustruję to dla kostek sześciościennych, ale możesz to zrobić dla kości z dowolną liczbą stron (w tym dodawanie różnych).

(przy okazji jest to również łatwe w czymś takim jak R lub Matlab, które będą wykonywać sploty)

Zacznij od czystego arkusza, w kilku kolumnach, i przejdź w dół kilka rzędów od góry (ponad 6).

  1. wstaw wartość 1 do komórki. To są prawdopodobieństwa związane z 0 kostkami. umieść 0 po lewej; to kolumna wartości - idź dalej z 1,2,3 w dół tak daleko, jak potrzebujesz.

  2. przesuń jedną kolumnę w prawo i w dół o jeden wiersz od „1”. wprowadź formułę „= suma (”, a następnie strzałkę w lewo strzałkę w górę (aby podświetlić komórkę zawierającą 1), naciśnij „:” (aby rozpocząć wprowadzanie zakresu), a następnie 5 razy strzałkę w górę, a następnie „) / 6 "i naciśnij klawisz Enter - w ten sposób powstaje formuła podobna =sum(c4:c9)/6 (gdzie C9jest komórka z 1 w niej).

    wprowadź opis zdjęcia tutaj

    Następnie skopiuj formułę i wklej ją do 5 komórek poniżej. Każdy z nich powinien zawierać 0,16667 (ish).

    wprowadź opis zdjęcia tutaj

    Nie wpisuj niczego w puste komórki, do których odnoszą się te formuły!

  3. przesuń w dół 1 i w prawo 1 od góry tej kolumny wartości i wklej ...

    wprowadź opis zdjęcia tutaj

    ... łącznie kolejne 11 wartości. Będą to prawdopodobieństwa dla dwóch kości.

    wprowadź opis zdjęcia tutaj

    Nie ma znaczenia, jeśli wkleisz kilka za dużo, po prostu dostaniesz zera.

  4. powtórz krok 3 dla następnej kolumny dla trzech kości i ponownie dla czterech, pięciu itd. kości.

    wprowadź opis zdjęcia tutaj

    Widzimy tutaj, że prawdopodobieństwo wyrzucenia na 4d6 wynosi 0,096451 (jeśli pomnożysz przez 4 6 , będziesz mógł zapisać go jako dokładną część).1246

Jeśli jesteś biegły w programie Excel - takie rzeczy jak kopiowanie formuły z komórki i wklejanie do wielu komórek w kolumnie, możesz wygenerować wszystkie tabele o wartości 10d6 w około minutę (prawdopodobnie szybciej, jeśli zrobiłeś to kilka razy).


Jeśli chcesz, aby kombinacje były liczone zamiast prawdopodobieństw, nie dziel przez 6.

Jeśli chcesz kości o różnych liczbach twarzy, możesz zsumować (zamiast 6) komórek, a następnie podzielić przez k . Możesz mieszać kości między kolumnami (np. Wykonaj kolumnę dla d6 i jedną dla d8, aby uzyskać funkcję prawdopodobieństwa dla d6 + d8):kk

wprowadź opis zdjęcia tutaj


5

Przybliżone rozwiązanie

Dokładne wyjaśnienie wyjaśniłem wcześniej (patrz poniżej). Oferuję teraz przybliżone rozwiązanie, które może lepiej odpowiadać Twoim potrzebom.

Pozwolić:

Xisi=1,...n

Sn

X¯

Z definicji mamy:

X¯=iXin

Innymi słowy,

X¯=Sn

Xinnn

X¯N(μ,σ2/n)

gdzie,

μ=(s+1)/2

σ2=(s21)/12

Xi

Ale,

S=nX¯

Mamy zatem:

SN(nμ,nσ2)

Dokładne rozwiązanie

Wikipedia ma krótkie wyjaśnienie, jak obliczyć wymagane prawdopodobieństwa. Jeszcze trochę wyjaśnię, dlaczego wyjaśnienie tam ma sens. W możliwym zakresie użyłem podobnej notacji do artykułu z Wikipedii.

nsnk

Definiować:

Fs,n(k)kns

Z definicji mamy:

Fs,1(k)=1s

sk1s

kk1k11

Fs,2(k)=i=1i=k1Fs,1(i)Fs,1(ki)

kk2k12

Fs,3(k)=i=1i=k2Fs,1(i)Fs,2(ki)

Kontynuując powyższą logikę, otrzymujemy równanie rekurencyjne:

Fs,n(k)=i=1i=kn+1Fs,1(i)Fs,n1(ki)

Zobacz link do Wikipedii, aby uzyskać więcej informacji.


@Srikant Doskonała odpowiedź, ale czy ta funkcja rozwiązuje coś arytmetycznego (tj. Nie rekurencyjnego)?
C. Ross

@DO. Ross Niestety nie sądzę. Podejrzewam jednak, że rekurencja nie powinna być tak trudna, o ile mamy do czynienia z odpowiednio małymi n i małymi. Możesz po prostu zbudować tabelę wyszukiwania i używać jej wielokrotnie w razie potrzeby.

1
Strona wikipedii, którą podłączyłeś, ma prostą, nierekurencyjną formułę, która jest pojedynczą sumą. Jedna pochodna jest w odpowiedzi Whubera.
Douglas Zare

Kotwica linku wiki jest martwa, czy wiesz o zamianie?
Midnighter

4

Funkcje charakterystyczne mogą sprawić, że obliczenia obejmujące sumy i różnice zmiennych losowych będą naprawdę łatwe. Mathematica ma wiele funkcji do pracy z rozkładami statystycznymi, w tym wbudowaną funkcję przekształcania rozkładu w jego funkcję charakterystyczną.

Chciałbym to zilustrować dwoma konkretnymi przykładami: (1) Załóżmy, że chcesz określić wyniki rzutu zbiorem kości o różnej liczbie boków, np. Rzuć dwiema sześciościennymi kostkami plus jedną ośmiościenną kością (tj. , 2d6 + d8 )? Lub (2) załóżmy, że chciałeś znaleźć różnicę dwóch rzutów kostką (np. D6-d6 )?

X faφX(t)faφX(t)=fa{fa}(t)=mi[mijatX]

XYfasolhX+Yh(n)=(fasol)(n)=m=-fa(m)sol(n-m)

Możemy użyć właściwości splotu Transformacji Fouriera, aby przekształcić to prościej pod względem charakterystycznych funkcji:

φX+Y(t)XYφX(t)φY(t)

Ta funkcja Mathematica uczyni funkcję charakterystyczną dla matrycy jednostronnej:

MakeCf [s_]: = 
 Moduł [{Cf}, 
  Cf: = CharacteristicFunction [DiscreteUniformDistribution [{1, s}], 
    t];
  Cf]

PMf rozkładu można odzyskać z jego charakterystycznej funkcji, ponieważ transformaty Fouriera są odwracalne. Oto kod Mathematica, aby to zrobić:

RecoverPmf [Cf_]: = 
  Moduł [{F}, 
    F [y_]: = Współczynnik Series [Cf /. t -> -I * Log [x], {x, 0, y}];
    FA]

Kontynuując nasz przykład, niech F będzie pmf, które wynika z 2d6 + d8.

F := RecoverPmf[MakeCf[6]^2 MakeCf[8]]

62)8=288S.={3),,20}20=26+8

In: = F / @ Range [3, 20]

Out = {1/288, 1/96, 1/48, 5/144, 5/96, 7/96, 13/144, 5/48, 1/9, 1/9, \
5/48, 13/144, 7/96, 5/96, 5/144, 1/48, 1/96, 1/288}

Jeśli chcesz poznać liczbę wyników, które sumują się do 10, oblicz

W: = 6 ^ 2 8 F [10]

Out = 30

XYfghXYh(n)=(fg)(n)=m=f(m)g(n+m)

Możemy użyć właściwości korelacji krzyżowej Transformacji Fouriera, aby przekształcić to prościej pod względem charakterystycznych funkcji:

φXY(t)X,YφX(t)φY(t)

Tak więc, używając Mathematica, aby znaleźć pmf G z d6-d6:

G := RecoverPmf[MakeCf[6] (MakeCf[6] /. t -> -t)]

62=36S={5,,5}5=1661=5

W: = Zakres G / @ [-5, 5]

Out = {1/36, 1/18, 1/12, 1/9, 5/36, 1/6, 5/36, 1/9, 1/12, 1/18, 1/36}

1
Oczywiście w przypadku dystrybucji dyskretnych, w tym dystrybucji wsparcia skończonego (takich jak te, o których tu mowa), cf jest po prostu funkcją generującą prawdopodobieństwo oszacowaną przy x = exp (it), co czyni ją bardziej skomplikowanym sposobem kodowania tej samej informacji.
whuber

2
@whuber: Jak mówisz, cf, mgf i pgf są mniej więcej takie same i łatwo przekształcają się w siebie nawzajem, jednak Mathematica ma wbudowaną funkcję cf, która działa ze wszystkimi rozkładami prawdopodobieństwa, o których wie, podczas gdy nie t mieć wbudowany pgf. To sprawia, że ​​kod Mathematica do pracy z sumami (i różnicami) kości przy użyciu cfs jest szczególnie elegancki w konstrukcji, bez względu na złożoność wyrażania kości, jak mam nadzieję, pokazałem powyżej. Ponadto nie zaszkodzi wiedzieć, jak CFS, FT, zwoje i korelacje krzyżowe mogą pomóc rozwiązać takie problemy.

1
@Elisha: Wszystkie zalety. Chyba najbardziej zastanawiam się, czy dziesięć lub więcej linii kodu Mathematica jest naprawdę bardziej „eleganckich” lub wydajniejszych niż pojedyncza linia, którą zaproponowałem wcześniej (lub jeszcze krótsza linia, którą Srikant przekazał Wolfram Alpha). Podejrzewam, że wewnętrzne manipulacje z charakterystycznymi funkcjami są bardziej uciążliwe niż proste zwoje potrzebne do zwielokrotnienia wielomianów. Z pewnością te ostatnie są łatwiejsze do wdrożenia w większości innych środowisk oprogramowania, jak wskazuje odpowiedź Glen_b. Zaletą twojego podejścia jest większa ogólność.
whuber

4

Oto inny sposób obliczenia rozkładu prawdopodobieństwa sumy dwóch kości ręcznie przy użyciu zwojów.

Aby ten przykład był naprawdę prosty, obliczymy rozkład prawdopodobieństwa sumy kostki trójstronnej (d3), której zmienną losową nazwiemy X, oraz kostki dwustronnej (d2), której zmienną losową zmienimy zadzwoń do Y.

Idziesz do stołu. W górnym rzędzie napisz rozkład prawdopodobieństwa X (wyniki rzutu sprawiedliwego d3). W lewej kolumnie napisz rozkład prawdopodobieństwa Y (wyniki rzutu sprawiedliwego d2).

Jedziesz na budowę zewnętrzną produkt w górnym rzędzie prawdopodobieństw z lewej kolumnie prawdopodobieństw. Na przykład komórka w prawym dolnym rogu będzie iloczynem Pr [X = 3] = 1/3 razy Pr [Y = 2] = 1/2 jak pokazano na załączonym rysunku. W naszym uproszczonym przykładzie wszystkie komórki są równe 1/6.

Następnie zsumujesz wzdłuż ukośnych linii macierzy produktu zewnętrznego, jak pokazano na dołączonym schemacie. Każda linia ukośna przechodzi przez jedną lub więcej komórek, które pokolorowałem tak samo: górna linia przechodzi przez jedną niebieską komórkę, kolejna linia przechodzi przez dwie czerwone komórki i tak dalej.

alternatywny tekst

Każda suma wzdłuż ukośnych reprezentuje prawdopodobieństwo w wynikowym rozkładzie. Na przykład suma czerwonych komórek równa się prawdopodobieństwu zsumowania dwóch kości do 3. Prawdopodobieństwa te pokazano po prawej stronie dołączonego diagramu.

Technikę tę można stosować z dowolnymi dwoma dyskretnymi rozkładami ze skończonym wsparciem. I możesz zastosować iteracyjnie. Na przykład, jeśli chcesz poznać rozkład trzech sześciościennych kości (3d6), możesz najpierw obliczyć 2d6 = d6 + d6; następnie 3d6 = d6 + 2d6.

Jest bezpłatny (ale zamknięty licencji) język programowania o nazwie J . Jest to język oparty na macierzy, którego korzenie sięgają APL. Ma wbudowane operatory do wykonywania zewnętrznych produktów i sum wzdłuż ukośnych w matrycach, dzięki czemu technika, którą zilustrowałem, jest dość łatwa do wdrożenia.

W poniższym kodzie J definiuję dwa czasowniki. Najpierw czasownik dkonstruuje tablicę reprezentującą pmf jednostronnej kostki. Na przykład d 6jest pmf 6-stronnej kostki. Po drugie, czasownik convznajduje zewnętrzny iloczyn dwóch tablic i sum wzdłuż linii ukośnych. Więc conv~ d 6wypisuje pmf z 2d6:

d =: $%
conv =: + //. @ (* /)
|: (2 + i.11) ,: conv ~ d 6
 2 0,0277778
 3 0,05555556
 4 0,0833333
 5 0,111111
 6 0,138889
 7 0,166667
 8 0,138889
 9 0,111111
10 0,0833333
11 0,05555556
12 0,0277778

Jak widać, J jest tajemniczy, ale zwięzły.


3

To w rzeczywistości zaskakująco skomplikowane pytanie. Na szczęście dla ciebie istnieje dokładne rozwiązanie, które bardzo dobrze wyjaśniono tutaj:

http://mathworld.wolfram.com/Dice.html

Prawdopodobieństwo, którego szukasz, wynika z równania (10): „Prawdopodobieństwo uzyskania punktów p (rzut p) na kostkach jednostronnych”.

W twoim przypadku: p = obserwowany wynik (suma wszystkich kości), n = liczba kości, s = 6 (kostka 6-stronna). Daje to następującą funkcję masy prawdopodobieństwa:

P(Xn=p)=1snk=0(pn)/6(1)k(nk)(p6k1n1)

Witamy na naszej stronie, Felix!
whuber

1

Uwielbiam nazwę użytkownika! Dobra robota :)

6×6=36

136223634364


Jestem tym bardzo zmieszany. Odpowiedziałem na bardzo nowe pytanie początkującego od osoby o imieniu die_hard, która najwyraźniej już nie istnieje, a następnie znalazłem moją odpowiedź dołączoną do tego starożytnego wątku!
Creosote

Twoja odpowiedź na pytanie na stats.stackexchange.com/questions/173434/… została połączona z odpowiedziami na ten duplikat.
whuber

1

nn-1

zan(l)=l-6kl-1 i n-1k6(n-1)zan-1(k)

Pierwszym limitem k w podsumowaniu jest sześć poprzedzających liczb. Np. Jeśli chcesz rzucić 13 za pomocą 3 kości, możesz to zrobić, jeśli pierwsze dwie kości wyrzucą między 7 a 12.

Drugi limit dla k w podsumowaniu to limity tego, co możesz rzucić kostką n-1

Wynik:

1 1 1  1  1   1
1 2 3  4  5   6   5  4   3   2   1
1 3 6  10 15  21  25 27  27  25  21  15  10  6    3   1
1 4 10 20 35  56  80 104 125 140 146 140 125 104  80  56  35  20  10   4   1
1 5 15 35 70 126 205 305 420 540 651 735 780 780 735 651 540 420 305 205 126 70 35 15 5 1  

edytuj: Powyższa odpowiedź była odpowiedzią na inne pytanie, które zostało połączone w pytanie przez C.Ross

Poniższy kod pokazuje, w jaki sposób obliczenia dla tej odpowiedzi (na pytanie o 5 kości) zostały wykonane w R. Są one podobne do sumowań wykonanych w Excelu w odpowiedzi przez Glena B.

# recursive formula
nextdice <- function(n,a,l) {
  x = 0
  for (i in 1:6) {
    if ((l-i >= n-1) & (l-i<=6*(n-1))) {
      x = x+a[l-i-(n-2)]
    }
  }
  return(x)  
}  

# generating combinations for rolling with up to 5 dices
a_1 <- rep(1,6)
a_2 <- sapply(2:12,FUN = function(x) {nextdice(2,a_1,x)})
a_3 <- sapply(3:18,FUN = function(x) {nextdice(3,a_2,x)})
a_4 <- sapply(4:24,FUN = function(x) {nextdice(4,a_3,x)})
a_5 <- sapply(5:30,FUN = function(x) {nextdice(5,a_4,x)})

@ user67275 Twoje pytanie zostało połączone w to pytanie. Ale zastanawiam się, jaki był twój pomysł na formułę: „Użyłem formuły: nie ma możliwości uzyskania 8: 5_H_2 = 6_C_2 = 15” ?
Sextus Empiricus,

1

Jednym z podejść jest stwierdzenie, że prawdopodobieństwo Xn=k jest współczynnikiem xk w rozszerzeniu funkcji generowania

(x6+x5+x4+x3)+x2)+x16)n=(x(1-x6)6(1-x))n

Tak więc na przykład z sześcioma kośćmi i celk=22, znajdziesz P.(X6=22)=1066. Ten link (do pytania math.stackexchange) daje również inne podejście

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.