Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Losowanie wagowe w procentach, gdzie każda wartość ma swój procent..
Forum PHP.pl > Forum > Przedszkole
Giluś
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 smile.gif
Sephirus
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ę
Giluś
Dzięki bardzo właśnie o coś takiego mi chodziło 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 smile.gif
Sephirus
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. }
Giluś
Dzięki, za poprawę 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ć smile.gif
Ale na takiej zasadzie miało to mniej więcej działać 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 smile.gif
Sephirus
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
Giluś
  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ę smile.gif


Dzięki bardzo i Pozdrawiam smile.gif
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.