• 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
392 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 344 wizyt
0 głosów
3 odpowiedzi 258 wizyt
pytanie zadane 17 kwietnia 2015 w Java przez lrk Początkujący (300 p.)
0 głosów
1 odpowiedź 127 wizyt
pytanie zadane 25 października 2018 w Java przez mn130496 Gaduła (3,080 p.)
Porady nie od parady
Forum posiada swój własny chat IRC, dzięki któremu będziesz mógł po prostu pogadać z innymi Pasjonatami lub zapytać o jakiś problem. Podstrona z chatem znajduje się w menu pod ikoną człowieka w dymku.IRC

64,198 zapytań

110,595 odpowiedzi

231,808 komentarzy

46,959 pasjonatów

Przeglądających: 244
Pasjonatów: 24 Gości: 220

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.

...