2009-11-23 62 views
1

我需要在一個範圍內創建一個數字數組,如:在數組中分配範圍

[1..5] 10次= [1,1,2,2,3,3,4, -1,4,5,5-]

[1..5]中的5倍= [1,2,3,4,5]

[1..5]中的3倍= [1,3, 5]

def distribute(start_value, end_value, times, is_integer) 
    array = Array.new(times-1) 

    min_value = [end_value,start_value].min 
    max_value = [end_value,start_value].max 

    if max_value-min_value<times 
     factor = (max_value-min_value).abs/(array.size).to_f 
    else 
     factor = (max_value-min_value).abs/(array.size-1).to_f 
    end 

    for i in 0..array.size 
     v = [ [max_value, factor*(i+1)].min, min_value].max 
     is_integer ? array[i] = v.round : array[i] = v 
    end 

    start_value < end_value ? array : array.reverse 
    end 

分發(1,5,10,真) => [1,1,1,2,2,3,3,4,4,4 ] #WRONG應該是[1,1,2,2,3,3,4,4,5,5]

distribute(5,1,5,true) => [5,4,3, 2,1] #OK

分發(1,5,3,真) =>並[4,5,5] #WRONG應該是[1,3,5]

回答

0

只是一點點修正......當ARRAY_SIZE是0

def distribute(start_value, end_value, array_size, want_ints) 
    diff = 1.0 * (end_value - start_value) 
    n = [array_size-1, 1].max 

    (0..(array_size-1)).map { |i| 
     v = start_value + i * diff/n 
     want_ints ? v.round : v 
    }  
    end 
+1

而不是複雜的特殊情況下的算法,你可以短路的方法:'返回[]除非array_size> 0'。至少對我來說,這樣更容易理解代碼。 – FMc 2009-11-23 14:08:35

5

怎麼回合這樣的:

def distribute(min,max,items) 
    min,max = [min,max].sort 
    (0...items).map {|i| (min + i * (max - min)/(items-1.0)).round} 
end 

或者,如果你真的需要整型/浮點標誌:

def distribute(min,max,items,ints) 
    min,max = [min,max].sort 
    a = (0...items).map {|i| min + i * (max - min)/(items-1.0)} 
    ints ? a.map {|i| i.round} : a 
end 

如果你真的需要這種反向去,如果參數是給你向後:

def distribute(min,max,items,ints) 
    usemin,usemax = [min,max].sort 
    diff = usemax - usemin 
    a = (0...items).map {|i| usemin + i * diff/(items-1.0)} 
    a.map! {|i| i.round} if ints 
    min != usemin ? a.reverse : a 
end 
+0

而顯然,如果您知道按照正確的順序獲取參數,則可以省略min,max =部分... – 2009-11-23 04:15:23

+0

也許我誤解了這個問題,但是這個答案對於OP的第二個問題似乎並不正確用例:'distribute(5,1,5,true)=> [5,4,3,2,1]'。 – FMc 2009-11-23 14:14:10

+0

是的。我只是在這種情況下添加了另一個變體。 – 2009-11-23 21:34:07