Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Losowanie na podstawie parametru :)
Forum PHP.pl > Forum > PHP
Naster
Witam.

Mam taki dylemat algorytmiczny smile.gif

Otóż przykładowo posiadam tablice
Kod
$array = array(100, 400, 300, 200, 600, 110, 500, 100);


i teraz potrzebuje wylosować jedną wartość ale na podstawie parametru. Chodzi oto aby np wartość 600 miała 5% szans na wylosowanie a wartość 100 np 40%.

Nie mam pojęcia jak się za to zabrać. Wszelkie sugestie, podpowiedzi mile widziane smile.gif

Z góry dziękuje za pomoc.
masiakla
Rozkład zmiennej losowej. Probabilistyka się kłania.
Naster
Dziękuje za pomoc smile.gif Takiej oczekiwałem.

Teraz zagłębie się w odpowiednie lektury i mam nadzieję że uda mi się przejść ten problem

Dziękuje.
celbarowicz
Wybierz taki generator liczb, aby z jednakowym prawdopodobieństwem losował liczby ze zbioru {1,2,3,...,100}.
podziel ten zbiór na mniejsze podzbiory tak aby:
jeśli wylosowana liczba jest ze zbioru {1,2,3,...,39,40} to przyporządkuj->100, 40%
jeśli wylosowana liczba jest ze zbioru {41,42,43,44,45}to przyporządkuj->600, 5%
itd.
pozdrawiam.

np: http://masterixzone.wordpress.com/2008/05/...dolosowych-cz2/
MateuszS
Naster, nie wiem jak na podstawie parametru, parametru w funkcji? Ja zrobiłem tak (wiem że pewnie zaraz ktoś poda specjalną funkcję która właśnie to robi co poniżej napisałem no ale, nudziło mi się

  1. <?
  2.  
  3. $array = array(100 => 40, 400 => 50, 300 => 10); // liczba => prawdopodobienstwo w %, suma 100%
  4.  
  5. function losuj($tablica) {
  6. $i=1;
  7. asort($tablica);
  8. foreach($tablica as $klucz=>$wartosc) {
  9. $nowaTablica[$i] = $klucz;
  10. if($i == 1) {
  11. $od[$i] = $i;
  12. $do[$i] = $wartosc;
  13. } else {
  14. $od[$i] = $poprzedni + 1;
  15. $do[$i] = $poprzedni + $wartosc;
  16. }
  17. $poprzedni = $do[$i];
  18. $i++;
  19. }
  20. $rand = rand(1, 100);
  21. for($i=1; $i<=3; $i++) {
  22. if($rand >= $od[$i] && $rand <= $do[$i]) {
  23. return $nowaTablica[$i];
  24. }
  25. }
  26.  
  27. }
  28.  
  29. echo losuj($array);
  30.  
  31. ?>


@masiakla, mieciesz pojęciami biggrin.gif
Naster
Panowie up:
Nie do końca oto chodzi.
Nie będę znał wartości tablicy od samego początku (tzn wartości będą dynamicznie zwracane podczas działania skryptu i nie sposób ich będzie przewidzieć).
Czyli nie mogę ustalić że wartość 300 będzie równe 50% :-)
masiakla
Cytat(MateuszS @ 6.09.2010, 21:49:22 ) *
  1. <?
  2.  
  3. $array = array(100 => 40, 400 => 50, 300 => 10); // liczba => prawdopodobienstwo w %, suma 100%

Komentarz twój wynika właśnie z definicji rozkładu zmiennej gdzie suma prawdopodobieństw ma wynosić 1, dla skończonej i nieskończonej ilości wartości. W tym przypadku mamy "rozkład skokowy" co niejako ułatwia zadanie z policzeniem.

Cytat(MateuszS @ 6.09.2010, 21:49:22 ) *
@masiakla, mieciesz pojęciami biggrin.gif

Po napisaniu posta właśnie zacząłem się zastanawiać, czy nie za bardzo pojechałem, bo wszak dla mnie wydaje się to proste, ale mam trochę lat na karku, o tyle dla kogoś innego może być trudne w zrozumieniu. Do tego napisanie aplikacji, która to wykorzystuje, może nie być wcale takie proste, choćby ogarnięcie zagadnień, których nawet za moich czasów nie uczyli w liceum, a to zadanie wymaga też poznania innych działów matematyki. Dlatego rozwiązanie twoje i celbarowicz'a wydaja mnie się bardziej przystępne.
Naster
masiakla: byłoby o wiele łatwiejsze (i wpadłem na nie wcześniej) gdyby nie szkopuł jeden.

Ok powiem otwarcie o co chodzi.

Skrypt będzie obliczał procentową szansę na to że gracz zada cios swój na podstawie statystyk innych graczy (nie będę znał ich ilości aż do czasu uruchomienia skryptu, więc muszę na jakiejś funkcji operować). Z matematyką nie miałem jak dotąd problemów (poziom licealny ukonczony tongue.gif) dlatego mam nadzieję że mi się uda.

Edit:
Jak się nie mylę problem mój muszę rozpatrywać na podstawie rozkładu gaussa (rozkładu normalnego)
masiakla
Rozkład Gaussa służy do rozkładu zmiennej ciągłej, w twoim przypadku jest skokowa. Czyli rozkład dwumianowy lub Poissona. Ogólnie musisz policzyć tylko dystrybuantę i wartość oczekiwaną.

Linki:
W miarę przywoite wytłumaczenie wartości oczekiwanej
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.