Idee algoritm generare numar pe baza altui numar intre anumite limite

Acesta este unul din momentele in care imi pare rau ca n-am invatat mai multa matematica in scoala :slight_smile:

Pornim de la un rating de utilizator din intervalul 0 - 5 (inclusiv de genul 3.45). Pe baza acestui rating vreau sa pun o anumita limita pentru o actiune pe care o poate face utilizatorul.

Pragurile pentru rating-ul integer ar fi:
rating 0 => limita 1
rating 1 => limita 2
rating 2 => limita 4
rating 3 => limita 8
rating 4 => limita 16
rating 5 => limita 20

Nu mi-ar fi greu sa o fac fix asa sub forma de “switch” si “case” dar ma incapatanez sa fac o formula care tinand cont de zecimale sa-mi dea niste limite care se afla si intre pragurile desemnate (mai ales ca sunt f. putine cazurile in care utilizatorii au un rating de tip integer)

Ceva idei?

Daca la 5 al aveai 32 era 2 la puterea rating.

3 Likes

Idei:
Partea intreaga.
Functie polinomiala din puncte.

poate :grin:

echo $thresholds[round($rating)];

sau daca schimbi limita 20 cu 32 obtii ceea ce a zis @mangusta86

1 Like

Buna observatia cu ridicarea la patrat. Din pacate 32 e prea mult pentru limitarea respectiva.

In acest caz o sa fac altceva (oricum limitele respective erau impuse de mine complet subiectiv):
rating 0 => limita 1
rating 5 => limita 20

orice alt caz va fi calculat cu regula de 3 simpla. caz inchis :slight_smile:

Ai un numar N finit de numere in intervalul [0,5] (in functie de reprezentarea ta floating-point). Le analizezi si gasesti maparea de la N la {1, 2, 4, 8, 16, 20}. Dupa o optimizezi folosind operatii pe biti, codomeniul are cardinal foarte mic deci banuiesc ca o sa fie doar o combinatie de cativa biti.

Just joking. Baga switch statement, e mai usor de inteles si de extins fata de o formula matematica.

1 Like

Uite ceva usor
Rating===5? 20 : Math.pow(2, Rating);
Nu e chiar matematic adar e mai simplu decat cu switch

la 4.9 da kix :slight_smile: dar da, e si asta o varianta

$ratingLimita[0]=1;
$ratingLimita[1]=2;
$ratingLimita[2]=4;
$ratingLimita[3]=8;
$ratingLimita[4]=16;
$ratingLimita[5]=20;

$limita=$ratingLimita[(int)$rating]; // sau round, cell

Nu fii prea destept, ca dupa revii si iti citesti codul dupa 2 ani si te uiti ce ai vrut sa faci.

$limits = [1,2,4,8,16,20]
$ratings = [0,1,2,3,4,5]

$limit =  $limits(array_search(intval($rating), ratings))

Mai simplu:

// R.      0 1 2 3  4  5
$limits = [1,2,4,8,16,20]
$limit = $limits(intval($rating))

in loc de intval poti sa folosesti ceil sau round

Eventual cu

mi-a dat 4.02857*x - 1.57143, dar nu e perfect.

2 Likes

thresholds este cam asa

$thresholds = [
    0 =>  1,
    1 =>  2,
    2 =>  4,
    3 =>  8,
    4 =>  16,
    5 =>  20
];