Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Losowanie liczb z określonym prawdopodobieństwem
zaajcu
post 2.01.2013, 12:11:41
Post #1





Grupa: Zarejestrowani
Postów: 206
Pomógł: 3
Dołączył: 18.08.2011
Skąd: Chrzanów

Ostrzeżenie: (0%)
-----


Cześć.
Mam mały problem z losowaniem liczb, ale może zacznę od przykładu, żeby było prościej.
A więc mam taką tablice:

  1. $liczby = array();
  2. $liczby[0] = array('liczba'=>'10','prawdopodobienstwo'=>0.6);
  3. $liczby[1] = array('liczba'=>'20','prawdopodobienstwo'=>0.3);
  4. $liczby[2] = array('liczba'=>'30','prawdopodobienstwo'=>0.09);
  5. $liczby[3] = array('liczba'=>'100','prawdopodobienstwo'=>0.01);


i chciałbym wylosować z niej jedna z liczb {10,20,30,100}, przy czym chciałbym aby prawdopodobieństwo wylosowania danej liczby wynosiło odpowiednio {0.6,0.3,0.09,0.01}

Jedyna koncepcja jaka mi przychodzi do głowy to umieścić w tablicy w tym przypadku 100 elementów i odpowiednio
60 liczb 10,
30 liczb 20
9 liczb 30
1 liczbę 100
dla takiego przykładu wydaje się to być dość proste rozwiązanie problem pojawia się wówczas gdy elementów będzie sporo i gdy prawdopodobieństwo będzie podane z dokładnością do 3 lub więcej elementów.

Można zrobić jakiś automat który będzie sam generował taka tablice i z niej losował jakiś index.
Pytanie czy nie da się tego zrobić jakoś prościej, lepiej?
Go to the top of the page
+Quote Post
sowiq
post 2.01.2013, 12:15:03
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Załóżmy, że prawdopodobieństwa wylosowania liczb sumują się do 100.

10 => 60
20 => 30
30 => 9
100 => 1

Losujesz liczbę 1-100. Jeśli wylosowana liczba znajduje się w przedziale 1-60, wylosowałeś 10. Jeśli w przedziale 61-90, wylosowałeś 20. Jeśli w przedziale 91-99, wylosowałeś 30. Jeśli wylosowana liczba to 100, wylosowałeś 100.
Go to the top of the page
+Quote Post
zaajcu
post 2.01.2013, 12:48:21
Post #3





Grupa: Zarejestrowani
Postów: 206
Pomógł: 3
Dołączył: 18.08.2011
Skąd: Chrzanów

Ostrzeżenie: (0%)
-----


Pomysł całkiem spoko, zaraz się za to wezmę i zobaczymy co z tego wyjdzie wink.gif
Pozdrawiam.
Go to the top of the page
+Quote Post
Pawel_W
post 2.01.2013, 13:42:35
Post #4





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

Ostrzeżenie: (0%)
-----


możesz też przemnożyć wszystkie prawdopodobieństwa przez wielokrotność 10, tak, aby były liczbami całkowitymi

wyjdzie Ci wtedy:
  1. $liczby = array();
  2. $liczby[0] = array('liczba'=>'10','prawdopodobienstwo'=>60);
  3. $liczby[1] = array('liczba'=>'20','prawdopodobienstwo'=>30);
  4. $liczby[2] = array('liczba'=>'30','prawdopodobienstwo'=>9);
  5. $liczby[3] = array('liczba'=>'100','prawdopodobienstwo'=>1);

następnie tworzysz nową tablicę, do której ładujesz odpowiedni 60 dziesiątek, 30 dwudziestek, 9 trzydziestek i 1 setkę, następnie losujesz element z tej tablicy wink.gif
Go to the top of the page
+Quote Post
zaajcu
post 2.01.2013, 14:37:15
Post #5





Grupa: Zarejestrowani
Postów: 206
Pomógł: 3
Dołączył: 18.08.2011
Skąd: Chrzanów

Ostrzeżenie: (0%)
-----


Cytat(sowiq @ 2.01.2013, 12:15:03 ) *
Załóżmy, że prawdopodobieństwa wylosowania liczb sumują się do 100.

10 => 60
20 => 30
30 => 9
100 => 1

Losujesz liczbę 1-100. Jeśli wylosowana liczba znajduje się w przedziale 1-60, wylosowałeś 10. Jeśli w przedziale 61-90, wylosowałeś 20. Jeśli w przedziale 91-99, wylosowałeś 30. Jeśli wylosowana liczba to 100, wylosowałeś 100.


znalazłem rozwiązanie o którym pisał sowiq http://forum.php.pl/index.php?showtopic=22868. Myślę że to jest to wink.gif

Dzięki pozdrawiam.

Ten post edytował zaajcu 2.01.2013, 14:38:05
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2025 - 04:21