在Ruby中,給出下面的陣列量表數組爲最低/最高
[-10, 5, 22, 54, 89, 152]
我會如何得到一個結果,如以下那裏是0分鐘,和100。MAX(這個結果是一個猜測,而不是數應該是什麼樣子的實際反射)
[0, 8, 24, 53, 85, 100]
注:中間的數字也擴展到適合。
在Ruby中,給出下面的陣列量表數組爲最低/最高
[-10, 5, 22, 54, 89, 152]
我會如何得到一個結果,如以下那裏是0分鐘,和100。MAX(這個結果是一個猜測,而不是數應該是什麼樣子的實際反射)
[0, 8, 24, 53, 85, 100]
注:中間的數字也擴展到適合。
下面是一個簡單的方法:
def normalize(list, scale = 100)
return unless (list.length >= 2)
min, max = list.minmax
range = max - min
list.map do |v|
((v - min) * scale/range)
end
end
這不會產生您所期望的相同結果,但我無法確定您爲什麼期待這些結果爲線性縮放值不會給出這些值。這裏有一些測試:
list = [-10, 5, 22, 54, 89, 152]
normalize(list)
# => [0, 9, 19, 39, 61, 100]
# Running it again changes nothing
normalize(normalize(list))
# => [0, 9, 19, 39, 61, 100]
list = [-1,0,1]
normalize(list)
# => [0, 50, 100]
你可以做到以下幾點:
ar = [-10, 5, 22, 54, 89, 152]
min = ar.min
range = ar.max - min
res = ar.map do |e|
((min - e).to_f/range).abs * 100
end
res
# => [0.0, 9.25925925925926, 19.753086419753085, 39.50617283950617, 61.111111111111114, 100.0]
你可能想圓了這些結果。
這是我的方法中,我決定陣列所以第一元件是在0移位,然後找出刻度:
def scale(a)
shift = a.first * -1 if a.first != 0 || 0
a.map! { |n| n + shift }
return a if a.last == 100
scale = a.last.to_f/100.00
a.map { |n| (n/scale).to_i }
end
puts scale([-10, 5, 22, 54, 89, 152]).inspect
puts scale([-10, 5, 22, 54, 89, 90]).inspect
puts scale([3, 5, 22, 54, 89, 90]).inspect
返回
[0, 9, 19, 39, 61, 100]
[0, 15, 32, 64, 99, 100]
[0, 2, 21, 58, 98, 100]
你想使用什麼舍入方法?你有什麼嘗試?提示:['minmax'](https://ruby-doc.org/core-2.4.1/Enumerable.html#method-i-minmax)是一個很好的開始。 – tadman
給每個數加10併除以1.62會得到一個從0到100的數組,但中間數會有很大的不同。 – Stefan
我已經添加了一個註釋,預期的結果只是猜測數字是什麼。 – Denny