Итак, я получил два числа, скажем, A и B.
A — любое положительное число, а B — процент от 0 до 100.
Мне нужен процент B от A, но случайным образом округляется вверх или вниз, например,
A = 15, B = 50, result=7(50%) or 8(50%)
A = 10, B = 33, result=3(67%) or 4(33%)
Мой текущий код
floor($A* ($B + rand(0, 9) ) / 100)
Но я считаю, что это не правильно, и есть лучшие решения для этого.
РЕДАКТИРОВАТЬ:
Я просмотрел ответы и действительно проверил их (Вот). Проблема с представленными решениями состоит в том, что все они используют rand (0,1), что означает, что оно всегда будет округляться точно вверх или вниз в 50% случаев. Но вот проблема: например, давайте снова возьмем случай «A = 10, B = 33». В принципе нет никакой разницы между B = 31 или B = 39. То, что я хотел, чтобы это было соответствовать процентам (например, 31 приведет к 3 в 90% раз и 4 в 10% случаев)
Из того, что я вижу в ответе, кажется, что мое оригинальное решение будет работать просто отлично. Первоначально я должен был упомянуть, что это не просто «случайное округление», а объяснить второй случай немного лучше.
Первоначально идея заключалась в том, что у меня есть массив, скажем, 10 предметов, и мне нужно получить 33% из них. Я не могу дать 3 или 4 из них все время, потому что это портит весь процент. Поэтому мне нужно, чтобы это было как минимум статистически правильно в долгосрочной перспективе.
Но в любом случае, спасибо за ваше время.
function myround($a, $b) {
$d = $a * $b / 100.0;
$f = floor($d);
if ((rand() / getrandmax()) > ($d - $f)) return $f + 1.0;
return $f;
}
Вместо того, чтобы случайным образом решать, какой способ округлить (который будет искажать ваши результаты случайным образом и давать вам недетерминированные функции), почему бы не сделать то, что делают банкиры и «округлить до четного»?
echo(round(1.5,0,PHP_ROUND_HALF_EVEN) . "<br>");
echo(round(-1.5,0,PHP_ROUND_HALF_EVEN) . "<br>");
Таким образом, 4,5 округляется до 4 и 3,5 округляется до 4. Таким образом, 50% времени ваша средняя точка будет округляться, а 50% времени ваша средняя точка будет округляться, как вам нужно.
Почему бы не отделить вопросы расчета процента и решения, как округлить?
$X = $A * $B / 100;
$Y = (rand(0,1) > 0) ? floor($X) : ceil($X);