问题的具体实例
我的 int 范围为 1-100。我想在此范围内生成 n 个总数,这些总数尽可能均匀分布,并包括第一个和最后一个值。
例子
start = 1, end = 100, n = 5
Output: [1, 25, 50, 75, 100]
start = 1, end = 100, n = 4
Output: [1, 33, 66, 100]
start = 1, end = 100, n = 2
Output: [1, 100]
我目前拥有
的是
我实际上有一个可行的方法,但我一直觉得我在想这个并且错过了一些更简单的东西?这是最有效的方法还是可以改进?
def steps(start, end, n):
n = min(end, max(n, 2) - 1)
mult = end / float(n)
yield start
for scale in xrange(1, n+1):
val = int(mult * scale)
if val != start:
yield val
请注意,我确保此函数将始终至少返回范围的下限值和上限值。所以,我强迫n >= 2
仅作为搜索参考,我使用它从渲染序列中采样图像帧,您通常需要第一个、中间、最后一个。但我希望能够更好地扩展以处理非常长的图像序列并获得更好的覆盖范围。
已解决:从所选答案
我最终使用了@vartec 答案的这个稍微修改过的版本,作为生成器,并且还限制了n
安全值:
def steps(start,end,n):
n = min(end, max(n, 2))
step = (end-start)/float(n-1)
return (int(round(start+x*step)) for x in xrange(n))