Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Losowanie liczb z określonym prawdopodobieństwem
Forum PHP.pl > Forum > PHP
zaajcu
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?
sowiq
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.
zaajcu
Pomysł całkiem spoko, zaraz się za to wezmę i zobaczymy co z tego wyjdzie wink.gif
Pozdrawiam.
Pawel_W
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
zaajcu
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.