• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java losowanie z pewnym prawdopodobieństwem

0 głosów
367 wizyt
pytanie zadane 25 października 2017 w Java przez Neron Nowicjusz (180 p.)
Cześć,

jestem jeszcze średnio wtajemniczony w programowanie dlatego postanowiłem poruszyć napotkany przeze mnie problem na forum. Mam do wylosowania 10 dowolnych liczb z różnym prawdopodobieństwem:

P1 = 0.1

P2 = 0.2

P3 = 0.05

P4 = 0.15

P5 = 0.11

P6 = 0.07

P7 = 0.04

P8 = 0.00

P9 = 0.12

P10 = 0.16

Wpadłem na pomysł, że mógłbym stworzyć zbiór tych liczb i każda z nich byłaby powtórzona proporcjonalnie do prawdopodobieństwa, z którym występuje. Jako zbiór potraktowałem tabelę jednowymiarową. Np. liczba pierwsza została wpisana do tabeli10 razy, liczba druga 20 razy, a trzecia 5 razy itd. Niestety do tabeli nie da się zastosować funkcji random - przynajmniej tak mi się wydaje. Czy ktoś ma jakiś pomysł na to jak rozwiązać to zagadnienie?

2 odpowiedzi

+2 głosów
odpowiedź 25 października 2017 przez ziemjok Gaduła (4,180 p.)
Możesz zrobić tak jak napisałeś i wylosować liczbę od 0 do 99 która będzie Twoim indeksem w tablicy

Ja jednak radziłbym zrobić dystrybuantę, czyli zsumować prawdopodobieństwa

czyli miałbyś P(P1)=0,1  P(P2)=0,3  P(P3)=0,35  P(P4)=0,50, itp

Możesz jeśli Ci wygodnie pomnożyc te wartości przez 100

Później musisz wylosować liczbę od 0 do 1 (albo od 0 do 100 jak pomnożyłeś poprzednio) i zobczyć do którego przedziału należy ta wartość

np wylosowałeś 0,12, należy do przedziału drugiego(bo pierwszy to 0-0,1) czyli wylosowałeś liczbe P2
komentarz 25 października 2017 przez Neron Nowicjusz (180 p.)
Pomysł z dystrybuantą bardzo dobry, dzięki :)
+1 głos
odpowiedź 25 października 2017 przez arek01996 Stary wyjadacz (12,130 p.)
Możesz wylosować liczbę z granicy (0, tablica.length-1) zapisać do zmiennej i wyświetlić tablicę o indeksie wylosowanym funkcją.
1
komentarz 25 października 2017 przez arek01996 Stary wyjadacz (12,130 p.)
Chociaż to kiepski pomysł ze względu na to że przy malutkim prawdopodobieństwu jakiegoś zdarzenia musiałbyś masę elementów wprowadzić do tablicy aby zachować proporcje. Twoja opcja jest dobra przy sporych prawdopodobieństwach typu:

P(a) = 0.1

P(b) = 0.3 etc.

Przy prawdopodobieństwach typu:

P(a) = 0.000000001

np losowanie lotto tablica musiałaby być olbrzymia.

Mógłbyś zrobić tak:

P(a) = 0.0001

P(b) = 0.4

P(c) = 0.3991

P(d) = 2

Wybierasz najmniejsze prawdopodobieństwo. czyli P(a) Mnożysz je tak długo aż dostaniesz liczbę całkowitą najlepiej 1.

czyli 0.0001 * x = 1 x = 10 000

Losujesz liczbę z przedziału 0 - 10 000 i sprawdzasz po kolei:

wynik = P(a)*10 000; wynik < x -> P(a) to prawda zakończ algorytm, jeśli nie to dalej:

wynik = wynik + P(b) * 10 000 wynik < x -> P(B) jest prawdą zakończ algorytm.

Mam nadzieję że rozumiesz
komentarz 25 października 2017 przez Neron Nowicjusz (180 p.)
Zastanawiałem się właśnie nad ogólnym przypadkiem. Twoje sugestie są bardzo pomocne. Dzięki :)

Podobne pytania

0 głosów
3 odpowiedzi 319 wizyt
0 głosów
3 odpowiedzi 253 wizyt
pytanie zadane 17 kwietnia 2015 w Java przez lrk Początkujący (300 p.)
0 głosów
1 odpowiedź 120 wizyt
pytanie zadane 25 października 2018 w Java przez mn130496 Gaduła (3,080 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

63,166 zapytań

109,403 odpowiedzi

228,554 komentarzy

42,677 pasjonatów

Przeglądających: 75
Pasjonatów: 4 Gości: 71

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...