2017-08-30 88 views
0

在Ruby中,給出下面的陣列量表數組爲最低/最高

[-10, 5, 22, 54, 89, 152] 

我會如何得到一個結果,如以下那裏是0分鐘,和100。MAX(這個結果是一個猜測,而不是數應該是什麼樣子的實際反射)

[0, 8, 24, 53, 85, 100] 

注:中間的數字也擴展到適合。

+0

你想使用什麼舍入方法?你有什麼嘗試?提示:['minmax'](https://ruby-doc.org/core-2.4.1/Enumerable.html#method-i-minmax)是一個很好的開始。 – tadman

+1

給每個數加10併除以1.62會得到一個從0到100的數組,但中間數會有很大的不同。 – Stefan

+0

我已經添加了一個註釋,預期的結果只是猜測數字是什麼。 – Denny

回答

2

下面是一個簡單的方法:

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] 
1

你可以做到以下幾點:

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

這是我的方法中,我決定陣列所以第一元件是在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]