Dla aktualnego zadania istnieje moduł programowy w c#, w którym w trybie iteracyjnym można uzyskać wyniki testów i obliczyć prawdopodobieństwa.
Jest cykl gry (dla obliczeń przyjmujemy nieskończony), w którym są dwa zdarzenia.
Pierwsze zdarzenie jest główne w cyklu gry.
Drugie - dodatkowe, jego wystąpienie zależy od wymaganego warunku w pierwszym zdarzeniu.
W pierwszym zdarzeniu tworzona jest jednowymiarowa tablica z 20 elementami.
int[] array = new int[20];
- Wybieramy liczbę elementów, do których zostanie dokonany zapis. Każdy zapis to wartość nominału monety.
Z pierwszej tablicy, która określa wagę liczby zapisywanych elementów.
int[] freq_element = new int[] { 170000, 300000, 285000, 178000, 59500, 4410, 2340, 720, 30 };
Z drugiej tablicy, która określa liczbę elementów zapisu
int[] count_element = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
- Losowo wybieramy pozycje elementów w tablicy w liczbie uzyskanej powyżej.
Przy tym, jeśli losowo trafimy już na zajętą pozycję, wybieramy nową pozycję.
- Przypisujemy wartości wybranym elementom.
Z pierwszej tablicy, która określa wagę nominału monety.
int[] freq_base = new int[] { 19000, 8000, 4000, 2500, 1000, 800, 350, 500, 350, 80, 20, 6 };
Z drugiej tablicy, która określa sam nominał monety.
int[] value_base = new[] { 1, 2, 3, 4, 5, 10, 15, 10, 20, 50, 70, 100 };
- Jeśli liczba monet wynosi 5 lub więcej, to określa początek drugiego zdarzenia
Drugie zdarzenie.
Dla pozostałych elementów 20 - N tworzymy cykl zapisu, gdzie N - liczba monet w pierwszym zdarzeniu.
Elementy tablicy, w których nie ma nominału monet (brak zapisu o monecie) domyślnie mają wartość 0.
- Po kolei dla każdego elementu tablicy, w którym znajduje się wartość 0, określamy warunek do zapisu nowej monety
prawdopodobieństwo zapisu określane jest wagą z tablicy
int[] new_write = new int[] { 14000, 36606 };
gdzie element 0 - zapisu nie ma; element 1 - zapis jest
- Warunek do zapisu ustalony, jest zapis
Z pierwszej tablicy, która określa wagę nominału monety.
int[] freq_add = new int[] { 19000, 8000, 4000, 2500, 1000, 800, 350, 500, 350, 80, 20, 6 };
Z drugiej tablicy, która określa sam nominał monety
int[] value_base = new[] { 1, 2, 3, 4, 5, 10, 15, 10, 20, 50, 70, 100 };
Jaka będzie średnia suma wartości/nominałów w tablicy w przypadku wystąpienia drugiego zdarzenia.
Jaka będzie średnia suma wartości/nominałów w tablicy w przypadku wystąpienia drugiego zdarzenia i dodatkowego warunku :
- gdy liczba monet w tablicy wynosi dokładnie 15, wtedy mnożone są przez X.
------------------------------------------------------------------------------------------------------------------
moje rozwiązanie:
są prawdopodobieństwa dla wystąpienia drugiego zdarzenia
p(N=5) = 0.00441
p(N=6) = 0.00234
p(N-7) = 0.00072
p(N=8) = 0.00003
Prawdopodobieństwo dodania nowej monety
pHave = 36606 / (14000 + 36606) = 0.7234
Prawdopodobieństwo braku monety
pLost = 1 - 0.7234 = 0.2766
oczekiwana średnia wartość nominału monety wynosi
E = (1*19000 + 2 * 8000 + 3 * 4000....70 * 20 + 100 * 6) / (19000 + 8000 .... + 20 + 6) = 2.547
średnia wartość monet w pierwszym zdarzeniu
t_one = 5 * p(N=5) + 6 * p(N=6) + 7 * p(N=7) + 8 *p(N=8);
średnia wartość monet w drugim zdarzeniu
t_two = (p(N=5) * 15 * pHave) + (p(N=6) * 14 * pHave) + (p(N=7) * 13 * pHave) + (p(N=8) * 12 * pHave);
Średnia końcowa suma nominałów monet
S = (t_one + t_two) * E;
Obliczenia prawdopodobieństwa całkowicie zgadzają się z wynikiem iteracyjnym w działającym modelu na 1000000000 cyklach.
Teraz w zadaniu pojawia się dodatkowy warunek (gdy liczba monet wynosi 15, wtedy wszystkie wartości/nominały mnożone są przez X)
znajdujemy prawdopodobieństwo wystąpienia 15 zapisów przy pierwszym zdarzeniu 5 - 8 zapisów
p15_5 = BinomialCoefficient(15, 10) * Math.Pow(pHave, 10) * Math.Pow(pLost, 5) * p(N=5);
p15_6 = BinomialCoefficient(15, 9) * Math.Pow(pHave, 9) * Math.Pow(pLost, 5) * p(N=6);
p15_7 = BinomialCoefficient(15, 8) * Math.Pow(pHave, 8) * Math.Pow(pLost, 5) * p(N=7);
p15_8 = BinomialCoefficient(15, 7) * Math.Pow(pHave, 7) * Math.Pow(pLost, 5) * p(N=8);
całkowite prawdopodobieństwo wystąpienia 15 zapisów wynosi (jest prawie równe pomiarom iteracyjnym)
p15_total = p15_5 + p15_6 + p15_7 + p15_8;
absolutne prawdopodobieństwo w drugim zdarzeniu (prawdopodobieństwo wewnątrz bonusowego cyklu)
p15_absol = p15_total / (p(N-5) + p(N-6) + p(N-7) + p(N-8));
Średnia suma nominałów przy 15 monetach
M = 15; // liczba zapisów
X = 1; // mnożnik
S15 = p15_total * M * X * E
Średnia końcowa suma wartości/nominałów
S_total = S15 + (1 - p15_absol) * S;
W moim wyobrażeniu S_total == S
ale wynik nie zgadza się o około 0.5 - 1.0 procenta.
trzeba wyjaśnić, w czym tkwi przyczyna