• 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

Object Storage Arubacloud
0 głosów
1,263 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,160 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,100 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,100 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
2 odpowiedzi 833 wizyt
pytanie zadane 20 lipca 2019 w JavaScript przez mknnn221 Początkujący (460 p.)
0 głosów
3 odpowiedzi 1,691 wizyt
0 głosów
1 odpowiedź 1,207 wizyt
pytanie zadane 25 października 2018 w Java przez mn130496 Gaduła (3,530 p.)

92,536 zapytań

141,377 odpowiedzi

319,455 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...