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 3.09.2014, 12:56:35
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 smile.gif
Go to the top of the page
+Quote Post
Sephirus
post 3.09.2014, 13:13:15
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ę


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Giluś
post 3.09.2014, 13:40:18
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 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
Go to the top of the page
+Quote Post
Sephirus
post 3.09.2014, 14:47:16
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. }


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Giluś
post 3.09.2014, 15:47:16
Post #5





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

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


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
Go to the top of the page
+Quote Post
Sephirus
post 3.09.2014, 16:12:27
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


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Giluś
post 3.09.2014, 19:03:39
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ę smile.gif


Dzięki bardzo i Pozdrawiam smile.gif
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 Wersja Lo-Fi Aktualny czas: 3.06.2024 - 18:09