2014-02-09 102 views
-2

均勻分佈號碼列表我已經看到了這個問題被問過,但我在尋找一個扭曲的答案:生成從範圍

考慮我有一個系列,如1-100,我想生成一個列表,具體步驟如下:numbers(1,100,5)。這將返回[1,25,50,75,100]。不過,我想返回[1,100,50,25,75][1,100,50,75,25]另一個例子是數字(1,10,10),它會給我類似於[1,10,5,2,7,3,8,4,9]的東西。

這甚至有可能嗎?這樣做的原因是能夠在不從幀1到幀2到幀3等的情況下渲染圖像序列。相反,我想渲染第一幀,最後一幀,中間幀,中間幀的中間,直到所有幀都被佔。

+2

名單你有不匹配的步長跳躍你的要求,它使你的問題很混亂。 – 2014-02-10 00:04:41

回答

1

你的問題有點不明確,但這應該有助於你開始。

def numbers(first, last, count): 
    nums = [first, last] 
    width = last - first 
    while len(nums) < count: 
     width /= 2 
     stepper = first 
     while stepper < last: 
      rounded = round(stepper) 
      if rounded not in nums: 
       nums.append(rounded) 
       if len(nums) == count: 
        break 
      stepper += width 
    return nums 

然後:

>>> numbers(0, 100, 5) 
[0, 100, 50, 25, 75] 
>>> numbers(0, 10, 10) 
[0, 10, 5, 2, 8, 1, 4, 6, 9, 3, 7] 
>>> numbers(0, 50, 50) 
[0, 50, 25, 12, 38, 6, 19, 31, 44, 3, 9, 16, 22, 28, 34, 41, 47, 2, 5, 8, 11, 14, 17, 20, 23, 27, 30, 33, 36, 39, 42, 45, 48, 1, 4, 7, 10, 13, 15, 18, 21, 24, 26, 29, 32, 35, 37, 40, 43, 46] 

的基本算法如下:

  • 開始與nums含有兩個端點
  • 初始化width的距離在兩者之間的列表端點
  • 然後,循環:
    • 減半width
    • 步驟通過firstfirst+widthfirst+2*width,...,last-widthlast,並添加這些之中取其是不是已經在numsnums(所以,對於numbers(0, 100, 5),第一循環迭代將嘗試0 ,50和100,並且只增加了50個,因爲這還沒有出現;第二次迭代將嘗試0,25,50,75和100,並且只添加25和75)。
    • 如果我們nums有足夠的數量,我們就大功告成了
  • 返回nums
+0

太棒了,謝謝。對於模糊和讓我的號碼錯誤感到抱歉。 Senshin比我更瞭解我想要的東西:) – user2832718

+0

我似乎對som範圍有些奇怪的結果,例如:數字(0,50,50)返回[0,50,25.0,12.0,24.0,36.0,48.0,60.0 ,6.0,0.8,0.0,3.0,42.0,5.0,3.0,9.0,15.0,21.0,27.0,33.0,39.0,45.0,51.0,1.0,2.0,4.0,5.0,7.0,8.0,10.0,11.0,13.0,14.0,16.0 ,17.0,19.0,20.0,22.0,23.0,26.0,28.0,29.0,31.0,32.0,34.0,35.0,37.0,38.0,40.0,41.0,43.0]。除了60和54之外,它是非常接近正確的。但是,它足夠接近我的工作範圍,所以我會將你的答案標記爲已解決,再次感謝! – user2832718

+1

@ user2832718糟糕,我的不好。 'stepper + = width'行應該在內部while循環的末尾。現在應該更加正確。請注意,你可能想要實現某種錯誤檢查(例如,如果你調用'numbers(0,10,20)'?會發生無限循環,因爲在0和10之間沒有20個整數)在使用之前。 – senshin

0

好的,所以你想要的框架有點奇怪,特別是因爲第一個例子中的元素不是均勻分佈的,例如。 100-75 = 25,75-50 = 25,50-25 = 25,25-1 = 24

但是,如果我們假定你總是希望在幀的開始和結束的值,並希望間隔均勻值盯住針對最大值,我們可以這樣做:

def numbers(start,stop,step=1): 
    frame = [start]+range(y,stop,(start-stop)/(step-1)) 
    return frame 

random模塊包括shuffle()需要一個數組並將其洗牌的方法就地

這意味着該函數變爲:

from random import shuffle 
def numbers(start,stop,step=1): 
    frame = [start]+range(y,stop,(start-stop)/(step-1)) 
    shuffle(frame) 
    return frame 

給我們下面的測試運行:

>>> numbers(1,100,5) 
[100, 50, 75, 1, 25] 
>>> numbers(1,10,10) 
[1, 3, 10, 9, 6, 5, 8, 4, 7, 2] 

原件(但錯誤的)答案

random模塊包括shuffle()方法需要一個數組並將其洗牌in-place

例如:

from random import shuffle 
def numbers(start,stop,step=1): 
    frame = range(start,stop,step) 
    shuffle(frame) 
    return frame 

然後調用這個函數,我們得到:

>>> numbers(1,100,25) 
[1, 51, 26, 76] 
>>> numbers(1,100,25) 
[76, 26, 1, 51] 

注意,說,按照range()功能,step值反覆加入start使得最終陣列形式爲[start, start+1*step, start+2*step ... start + n*step],其中start+n*step小於stop,而start+(n+1)*step大於stop

+1

我認爲OP的期望輸出是例如如果你看到那裏的模式,那麼'數字(0,100,9)'(忽略他的錯誤)將是0,100,50,25,75,12.5,37.5,62.5,87.5,前兩個不是隨機的,而是[0,100]→50的中間值,然後是[0,50]→25和[50,100]→75的中間值,然後是[0, 25]→12.5;等(除了四捨五入到整數,我猜。) – senshin