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

Algorytm losowania z prawdopodobieństwem

Object Storage Arubacloud
0 głosów
2,936 wizyt
pytanie zadane 10 grudnia 2016 w Algorytmy przez tyskocz Nowicjusz (230 p.)
Ma ktoś może w zasięgu wiedzy algorym losujący liczbę z tablicy z określonym prawdopodobieństwem?

tzn mam tablicę integerów z wartościami od 0 do 1000 im większa liczba tym większe prawdopodobieństwo że na nią padnie.

2 odpowiedzi

0 głosów
odpowiedź 11 grudnia 2016 przez Evelek Nałogowiec (28,960 p.)

Zrozumiałem to tak, że liczba 1 jest losowana z prawdopodobieństwem 1/1000, liczba 2 z prawdopodobieństwem 2/1000, potem mamy 3/1000, 4/1000 itd. ale to chyba nie o to chodzi. indecision

0 głosów
odpowiedź 11 grudnia 2016 przez .kassad Gaduła (3,420 p.)
edycja 11 grudnia 2016 przez .kassad

Metoda nazywa się chyba metodą eliminacji (tak mi się wydaje, ale to chyba mało istotne). Losujesz najpierw jedną liczbę z przedziału od x1 do Xn (w twoim przypadku od 0 do 1000). Losujesz drugą, z przedziału od 0 do prawdopodobieństwa wylosowania najbardziej prawdopodobnej liczby (wydaje mi się, że brzmi skomplikowanie, ale w twoim przypadku będziesz losował tę drugą liczbę, z przedziału od 0 do prawdopodobieństwa wylosowania 1000), patrząc na wykres, prawa ograniczenie przedziału to będzie P(x4). Ważnym jest też, że suma wszystkich prawdopodobieństw musi być być równa 1. 

Ponieważ zaczynasz liczyć od 0, prawdopodobieństwa wylosowania poszczególnych liczb wyznaczasz dzieląc (indeks liczby +1) przez sumę wszystkich liczb. Czyli u ciebie prawdopodobieństwo wylosowania jedynki to 2/(suma od 1 do 1001), prawdopodobieństwo wylosowania 100 to 101/(suma od 1 do 1001), prawdopodobieństwo 0 to 1/(suma od 1 do 1001). 

Najwygodniej będzie ci trzymać prawdopodobieństwa poszczególnych liczb w tablicy - pod indeksem 0 będziesz miał prawdopodobieństwo wylosowania 0, pod id 5, P(5) itd. Pierwsza wylosowana liczba określi, który element wybierasz. druga wylosowana liczba to jakieś prawdopodobieństwo. Sprawdzasz czy druga liczba, którą wylosowałeś, jest mniejsza lub równa od liczby która znajduje się w tablicy. Jeżeli jest mniejsza lub równa, zwracasz tę liczbę. Jeżeli nie, od nowa losujesz i pierwszą i drugą liczbę.

Może w postaci jakiegoś kodu 

tablica_prawdopodobieństw - tablica z prawdopodobieństwami poszczególnych liczb. 
id - liczba określająca id w tablica_prawdopodobieństw 
prawd - określa, czy zwracamy wylosowaną liczbę, czy nie.
sum = suma od 0 do 1000

do:
          id = rand(0,1000)
          prawd = rand(0, sum)
while ( tablica_prawdopodobieństw[id] < prawd ) 

 

Jakby któraś część była niezrozumiała, pisz, postaram się rozwiać wątpliwości. 

 

Tak mnie naszło, że istnieje też taki łopatologicznie prosty sposób, żeby uzyskać niemal identyczny efekt, jak opisałem: 
Przygotowujesz sobie bardzo dużą tablicę i na jej kolejne komórki wpisujesz:
0 - jeden raz
1 - dwa razy
3 - trzy razy
itd. 
Potem losujesz sobie jakąś liczbę z tablicy. 
 

Podobne pytania

+1 głos
2 odpowiedzi 685 wizyt
+1 głos
2 odpowiedzi 577 wizyt
pytanie zadane 2 września 2016 w C i C++ przez niezalogowany
0 głosów
3 odpowiedzi 1,731 wizyt

92,580 zapytań

141,433 odpowiedzi

319,665 komentarzy

61,966 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!

...