Prawdopodobieństwo wylosowania liczby

0

Cześć,

potrzebuję pomocy przy stworzeniu algorytmu liczącego prawdopodobieństwo wylosowania liczby z określonego zbioru, tak by średnia wyników była bliska podanej wartości T. Zbiór składa się z liczb naturalnych, a T zawiera się w przedziale od najmniejszej do największej liczby ze zbioru.

Przykładowe dane:

Zbiór: [1000, 10000]
T: 2000
Wynik: [8/9, 1/9]

Poprawność wyniku można sprawdzić sumując wyniki mnożenia kolejnych elementów zbioru z kolejnymi elementami wyniku, dla podanego przykładu:

T = 1000 * 8/9 + 10000 * 1/9 = 2000

Próbowałem kilku działań na dostępnych danych (opartych o metodę ruletki, koła fortuny), jednak nie przyniosły one oczekiwanego rezultatu - albo wartość wyliczona w sposób podany powyżej nie była równa T, albo suma wszystkich elementów wyniku nie była równa 1.

Przy zbiorze złożonym z więcej niż dwóch elementów istnieje wiele poprawnych wyników, przykład takich danych:

Zbiór: [1000, 2000, 3000]
T: 2000
Poprawne wyniki: [1/5, 3/5, 1/5], [1/3, 1/3, 1/3], [1/100, 98/100, 1/100]... 

Obecnie interesuje mnie jedynie by prawdopodobieństwo wylosowania każdego elementu było niezerowe.

Mam nadzieje, że opisałem wszystko zrozumiale i liczę na wasze umysły! Dzięki za poświęcony czas! :)

1

Moim zdaniem zadanie sprowadza się do rozwiązania układu dwóch równań liniowych z dwoma niewiadomymi. Jeśli zbiór zawiera liczby
l_1,...,l_n
a liczba T spełnia nierówności l_1 < T < l_n
to dzielimy zbiór na dwie części
l_1,...,l_k
l_(k+1),..,l_n

W pierwszej części wszystkie liczby są mniejsze lub równe T, a w drugiej większe lub równe T Wszystkim liczbom z pierwszej części przypisujemy prawdopodobieństwo p, a liczbom z drugiej części prawdopodobieństwo q (k*p + (n-k)*q = 1). Niewiadomymi w układzie równań są liczby p i q.

0
def gen_pmf(V, T):
    assert(V[0] <= T <= V[-1])

    left = 0
    i = 0
    while i < len(V) and V[i] + left <= T:
        left += V[i]
        i += 1
    left_size = i
    right, right_size = sum(V) - left, len(V) - left_size

    div = left * right_size - right * left_size
    if div == 0:
        div = 1

    p = abs(float(T * right_size - right) / div)
    q = abs(float(T * left_size - left) / div)
    if p == 0  and right_size > 0:
        p = 0.00005
        q = (1 - left_size * p) / right_size
    if q == 0 and left_size > 0:
        q = 0.00005
        p = (1 - right_size * q) / left_size

    pmf = [0] * len(V)
    for i in xrange(0, left_size):
        pmf[i] = p
    for i in xrange(left_size, len(V)):
        pmf[i] = q

    return pmf
0

ja bym to wnioskował statystycznie, wiedząc, że:

wartość oczekiwana rozkładu jednostajnego dyskretnego wynosi (a+b)/2
a wariancja (n^2-1)/12

gdzie n - liczba obserwazcji, n = b-a+1

0

Najprościej zrobić to tak. Dla dwóch elementów można policzyć wynik z proporcji. Do jedna dwie linie kod. Dla większych zbiorów (n>2), wystarczy policzyć średnia arytmetyczną n-1 elementów, Zredukować zbiór do 2 dwuelementowego i rozwiać z proporcji :). "zgrupowanym" paramentrą przypisać jednakowe prawdopodobieństwo.

0

Może powtórzę - wystarczy rozwiązać układ dwóch równań liniowych z dwoma niewiadomymi. Jedno z równań podałem wcześniej, drugie wygląda tak:

p*(l_1 + ... + l_k) + q*(l_(k+1) + ... + l_n) = T

1 użytkowników online, w tym zalogowanych: 0, gości: 1