Gerando múltiplos / amostras uniformemente distribuídos dentro de um intervalo
Instância específica do problema
Eu tenho um intervalo de int de 1-100. Eu quero gerar n números totais dentro desse intervalo que sãotão uniformemente distribuído quanto possível e inclua o primeiro e o último valor.
Exemplo
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]
O que eu tenho atualmente
Eu realmente tenho uma abordagem de trabalho, mas eu continuo sentindo que estou pensando nisso e falta algo mais simples? Esta é a abordagem mais eficiente ou poderia ser melhorada?
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
Note que estou garantindo que esta função retornará sempre pelo menos os valores limite inferior e superior do intervalo. Então eu forçon >= 2
Apenas para referência de pesquisa, estou usando isso para amostrar quadros de imagem de uma sequência renderizada, onde você normalmente deseja o primeiro, o meio, o último. Mas eu queria ser capaz de escalar um pouco melhor para lidar com seqüências de imagens realmente longas e obter uma melhor cobertura.
Resolvido: da resposta selecionada
Acabei usando esta versão ligeiramente modificada da resposta do @vartec, para ser um gerador, e tambémn
valor para segurança:
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))