Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Losowanie na podstawie parametru :), Im większa wartość tym mniejsze prawdopodobnieństwo
Naster
post
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 2.08.2007

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


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.
Go to the top of the page
+Quote Post
masiakla
post
Post #2





Grupa: Zarejestrowani
Postów: 80
Pomógł: 17
Dołączył: 4.09.2010
Skąd: far far away

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


Rozkład zmiennej losowej. Probabilistyka się kłania.

Ten post edytował masiakla 6.09.2010, 20:13:24
Go to the top of the page
+Quote Post
Naster
post
Post #3





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 2.08.2007

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


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.
Go to the top of the page
+Quote Post
celbarowicz
post
Post #4





Grupa: Zarejestrowani
Postów: 253
Pomógł: 31
Dołączył: 30.03.2009
Skąd: Szczecin

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


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/

Ten post edytował celbarowicz 6.09.2010, 20:47:50
Go to the top of the page
+Quote Post
MateuszS
post
Post #5





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

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


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


Ten post edytował MateuszS 6.09.2010, 20:53:15


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
Naster
post
Post #6





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 2.08.2007

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


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% :-)
Go to the top of the page
+Quote Post
masiakla
post
Post #7





Grupa: Zarejestrowani
Postów: 80
Pomógł: 17
Dołączył: 4.09.2010
Skąd: far far away

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


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.

Ten post edytował masiakla 6.09.2010, 21:19:48
Go to the top of the page
+Quote Post
Naster
post
Post #8





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 2.08.2007

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


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)

Ten post edytował Naster 6.09.2010, 21:34:47
Go to the top of the page
+Quote Post
masiakla
post
Post #9





Grupa: Zarejestrowani
Postów: 80
Pomógł: 17
Dołączył: 4.09.2010
Skąd: far far away

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


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

Ten post edytował masiakla 6.09.2010, 22:26:19
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 Aktualny czas: 22.08.2025 - 09:22