Согласно Wikipedia, стандартного определения процентили нет; однако они дают несколько возможных определений. Код, который вы опубликовали, ближе всего к методу Nearest Rank, но это не совсем то же самое.
Формулы они дают
n = ceiling((P/100) x N)
где N
длина списка, P
является процентилем, и n
будет порядковый рангом. Вы уже сделали разделение на 100. Глядя на примеры, которые они дают, ясно, что «порядковый ранг» является индексом в списке, но он 1-относительный. Таким образом, чтобы получить индекс в массиве Java, вы должны вычесть 1. Поэтому правильная формула должна быть
n = ceiling(percentile * N) - 1
Использование переменных в коде, эквивалент Java будет
(int) Math.ceil(percentiles[i] * latencies.length) - 1
Это не совсем тот код, который вы написали. Когда вы нанесете double
на int
, результат округляется до 0, т. Е. Это эквивалент функции «пол». Так что ваш код вычисляет
floor(percentiles[i] * latencies.length)
Если percentiles[i] * latencies.length
не является целым числом, то результат будет таким же в любом случае. Однако, если это целое число, так что «пол» и «потолок» имеют одинаковое значение, тогда результат будет другим.
Пример из Википедии - это вычисление 40-го процентиля, когда список {15, 20, 35, 40, 50}. Их ответ заключается в том, чтобы найти второй элемент в списке, т. Е. 20, потому что 0.40 * 5 = 2.0 и потолок (2.0) = 2.0.
Однако код:
int index = (int) (percentiles[i] * latencies.length);
приведет к index
быть 2, что не то, что вы хотите, потому что это даст вам третий элемент в списке, а не второй.
Так что, чтобы соответствовать определению Википедии, ваш расчет индекса нужно будет немного изменить. (С другой стороны, я не удивлюсь, если кто-то придет и скажет, что ваши вычисления верны, а Википедия ошибается. Посмотрим ...)
Обратите внимание, что не только ваш 'percentiles' метода вычисления значения процентилей (не всегда правильно - видеть мой ответ) и возврат значения, он также оставляет отсортированный массив 'latencies', что является побочным эффектом, который может быть нежелательным. Это, вероятно, безвредно для маленькой программы, которую вы пытаетесь написать, но в целом это не хорошая практика для метода иметь побочный эффект, который не является целью метода. – ajb