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
<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>
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?
<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>
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:
<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>