Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Losowanie wagowe w procentach, gdzie każda wartość ma swój procent..
Giluś
post
Post #1





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


Hej, potrzebuję zrobić losowanie wagowe.. posiadam takie wartości:

Kod
0.1 = 70%
0.2 = 70%
0.3 = 70%
0.4 = 70%
0.5 = 70%
0.6 = 50%
0.7 = 50%
0.8 = 50%
0.9 = 50%
1.0 = 50%
1.1 = 30%
1.2 = 30%
1.3 = 30%
1.4 = 30%
1.5 = 10%
1.6 = 10%
1.7 = 10%
1.8 = 5%
1.9 = 5%
2.0 = 5%


Znalazłem coś takiego do losowania liczb z przecinkiem:

  1. $min=0.1;
  2. $max=2.0;
  3. $liczba=rand(pow(10,1)*$min,pow(10,1)*$max)/pow(10,1);
  4. echo $liczba;


Ale teraz jak wylosować daną liczbę z odpowiednią jej "wagą" ?


Pozdrawiam i z góry bardzo dziękuje za pomoc (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Jeśli masz tak konkretnie ustalone wagi najlepiej użyć myku z tablicami.

  1. $tablicaLiczb = array();
  2. $tablicaLiczb['0.1'] = 70;
  3. $tablicaLiczb['0.6'] = 50;
  4. $tablicaLiczb['2.0'] = 5;
  5. // itd...
  6.  
  7. $tablica = array();
  8. $ostatniaLiczba = 0;
  9.  
  10. foreach($tablicaLiczb AS $liczba => $waga) { // dla każdej liczby do wylosowania
  11. for($i = 0; $i < $waga; $i++) { // generujemy liczby w ilości równej wadze liczby
  12. $tablicaLiczb[$ostatniaLiczba++] = $liczba;
  13. }
  14. }
  15.  
  16. echo $tablicaLiczb[mt_rand(0,$ostatniaLiczba-1)]; // losujemy liczbę z zakresu wygenerowanych liczb i zwracamy rekord tablicy pod tą liczbą zawierający naszą szukaną liczbę
Go to the top of the page
+Quote Post
Giluś
post
Post #3





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


Dzięki bardzo właśnie o coś takiego mi chodziło (IMG:style_emoticons/default/smile.gif)

A czy jest możliwość, zrobienia czegoś takiego: Jak losowanie się nie powiedzie to wskaże wartość "0", czyli gdybym miał tylko, jedną wartość np.:
" $tablicaLiczb['1'] = 0; " to wtedy zwracało by wynik: np.: 0.0 ?

Bo w tym momencie robi się pętla, a ja bym chciał aby była tylko 1 próba, jak wylosuję to ok, "TRUE + wartość", jak nie to "FLASE + 0.0.." ?


Pozdrawiam i z góry bardzo dziękuje (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Sephirus
post
Post #4





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Po prostu przed losowaniem trzeba wykryć czy count($tablica) > 0 i tam w ogóle był błąd ($tablicaLiczb => $tablica) sorki że nie zauważyłem powinno być:

  1. $tablicaLiczb = array();
  2. $tablicaLiczb['0.1'] = 70;
  3. $tablicaLiczb['0.6'] = 50;
  4. $tablicaLiczb['2.0'] = 5;
  5. // itd...
  6.  
  7. $tablica = array();
  8. $ostatniaLiczba = 0;
  9.  
  10. foreach($tablicaLiczb AS $liczba => $waga) { // dla każdej liczby do wylosowania
  11. for($i = 0; $i < $waga; $i++) { // generujemy liczby w ilości równej wadze liczby
  12. $tablica [$ostatniaLiczba++] = $liczba;
  13. }
  14. }
  15.  
  16. if(count($tablica)) {
  17. echo $tablica[mt_rand(0,$ostatniaLiczba-1)]; // losujemy liczbę z zakresu wygenerowanych liczb i zwracamy rekord tablicy pod tą liczbą zawierający naszą szukaną liczbę
  18. } else {
  19. echo '0.0';
  20. }
Go to the top of the page
+Quote Post
Giluś
post
Post #5





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


Dzięki, za poprawę (IMG:style_emoticons/default/smile.gif)

Troszkę mnie naprowadziłeś, ale to miało wyglądać całkowicie inaczej, zamieszkam kod który raczej działa tak jak należy, ewentualnie jak coś znajdziesz to może poprawić (IMG:style_emoticons/default/smile.gif)
Ale na takiej zasadzie miało to mniej więcej działać (IMG:style_emoticons/default/smile.gif)
  1. <?php
  2.  
  3. $min=0.1;
  4. $max=2.0;
  5. $liczba=rand(pow(10,1)*$min,pow(10,1)*$max)/pow(10,1);
  6.  
  7. $tablica = array();
  8. $tablica['0.1'] = '70';
  9. $tablica['0.2'] = '70';
  10. $tablica['0.3'] = '70';
  11. $tablica['0.4'] = '70';
  12. $tablica['0.5'] = '70';
  13.  
  14. $tablica['0.6'] = '50';
  15. $tablica['0.7'] = '50';
  16. $tablica['0.8'] = '50';
  17. $tablica['0.9'] = '50';
  18. $tablica['1.0'] = '50';
  19.  
  20. $tablica['1.1'] = '30';
  21. $tablica['1.2'] = '30';
  22. $tablica['1.3'] = '30';
  23. $tablica['1.4'] = '30';
  24.  
  25. $tablica['1.5'] = '10';
  26. $tablica['1.6'] = '10';
  27. $tablica['1.7'] = '10';
  28.  
  29. $tablica['1.8'] = '5';
  30. $tablica['1.9'] = '5';
  31. $tablica['2'] = '5';
  32.  
  33. $procent = $tablica[''.$liczba.''];
  34.  
  35. $losuj = rand(1, 100);
  36. if($losuj <= $procent) {
  37. echo $liczba;
  38. }
  39. else {
  40. echo '0.0';
  41. }



Pozdrawiam i z góry dziękuje (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Sephirus
post
Post #6





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Achaaaa to o to chodzilo :-) po Twoim opisie nie wpadl bym. Powiedz mi tylko po co wstawiasz kilka razy pow(10,1)? Przeciez to jest po prostu 10 :-)

Pozdrawiam
Go to the top of the page
+Quote Post
Giluś
post
Post #7





Grupa: Zarejestrowani
Postów: 377
Pomógł: 9
Dołączył: 2.11.2010

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


  1. $liczba=rand(10*$min,10*$max)/10;

Ano faktycznie można tak, to losowanie gdzieś znalazłem w internecie i go tylko skopiowałem nie przyglądając mu się (IMG:style_emoticons/default/smile.gif)


Dzięki bardzo i Pozdrawiam (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.09.2025 - 17:17