問題 I の特定のインスタンスに
は、1 ~ 100 の範囲の int があります。この範囲内で、できるだけ均等に分散され、最初と最後の値を含む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))