Это хорошо известный способ масштабирования номеров коллекций. У него есть более точное имя, но я не могу вспомнить и не могу найти его в Google.
def scale(numbers, min, max)
current_min = numbers.min
current_max = numbers.max
numbers.map {|n| min + (n - current_min) * (max - min) / (current_max - current_min)}
end
dataset = [1,30000,15000,200,3000]
result = scale(dataset, 0.1, 10.0)
=> [0.1, 10.0, 5.04983499449982, 0.165672189072969, 1.08970299009967]
scale(result, 1, 30000)
=> [1.0, 30000.000000000004, 15000.0, 199.99999999999997, 3000.0000000000005]
Как видите, вы должны знать о проблемах округления. Возможно, вам также следует убедиться, что вы не получите целые числа как min и max, поскольку целочисленное деление повредит результат.