Share via


Простая задача

Моя исходная версия функции получения гистограмм, приведенная в предыдущей заметке, содержала небольшую ошибку. Сможете ли вы ее обнаружить безподсказки ?

private static int[] CreateHistogram(IEnumerable<double> data, int buckets, double min, double max)
{
int[] results = new int[buckets];
double multiplier = buckets / (max - min);
foreach (double datum in data)
{
int index = (int) ((datum - min) * multiplier);
if (0 <= index && index < buckets)
results[index] += 1;
}
return results;
}

Конечно, если это был бы не код, написанный на коленке, а промышленный код, то там была бы куча дополнительных проверок; ошибка, о которой идет речь, заключается именно в логике, а не в заключении типа «метод не проверяет, что минимальное значение может быть больше максимального» и т.п.

Подсказка: после первого запуска, полученная гистограмма выглядела нормально. Но затем, я внес небольшие изменения в аргументы, и полученная гистограмма стала явно неправильной. Сможете ли вы найти ошибку?

Оригинал статьи