Gleichmäßig verteilte Multiples / Samples innerhalb eines Bereichs erzeugen
Spezifische Instanz des Problems
Ich habe einen Int-Bereich von 1-100. Ich möchte n Gesamtzahlen in diesem Bereich erzeugen, die sindso gleichmäßig wie möglich verteilt und füge den ersten und den letzten Wert hinzu.
Beispiel
<code>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] </code>
Was ich aktuell habe
Ich habe tatsächlich einen Arbeitsansatz, aber ich habe immer das Gefühl, dass ich darüber nachdenke und etwas Einfacheres verpasse. Ist dies der effizienteste Ansatz oder könnte dies verbessert werden?
<code>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 </code>
Beachten Sie, dass diese Funktion immer mindestens den unteren und oberen Grenzwert des Bereichs zurückgibt. Also, ich zwingen >= 2
Nur als Referenz für die Suche benutze ich diese Option, um Bildrahmen aus einer gerenderten Sequenz abzutasten, in der Sie normalerweise die erste, mittlere und letzte verwenden möchten. Aber ich wollte in der Lage sein, ein bisschen besser zu skalieren, um wirklich lange Bildsequenzen zu verarbeiten und eine bessere Abdeckung zu erzielen.
Gelöst: Aus der ausgewählten Antwort
Ich habe letztendlich diese leicht modifizierte Version von @ vartecs Antwort verwendet, um ein Generator zu sein und auch die Obergrenze zu setzenn
Wert für die Sicherheit:
<code>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)) </code>