Quais são os melhores métodos para gerar com precisão números inteiros aleatórios distribuídos de acordo com uma lei de energia? A probabilidade de obter ( k = 1 , 2 , … ) deve ser igual a p k = k - γ / ζ ( γ ) e o método deve funcionar bem para qualquer γ > 1 .
Eu posso ver duas abordagens ingênuas:
Calcular até alguns grande k max para que Σ k max K = 1 é "suficientemente perto" para 1, em seguida, gerar números inteiros de acordo com estas probabilidades. Isso simplesmente não funcionará se γ for próximo de 1, pois k max precisaria ser enorme.
Desenhe números reais de uma distribuição contínua da lei de energia (um problema mais fácil que eu sei resolver) e arredonde-os para números inteiros de alguma maneira. É possível calcular analiticamente a probabilidade precisa de obter cada número inteiro com o método acima. I podem utilizar rejeição para corrigir estes para (que também pode ser calculado sempre que possa avaliar o ζ função). (Isso seria um pouco complicado, pois eu teria que arredondar de forma a obter números inteiros com maior probabilidade que p k para k maior que algum valor pequeno e manipular k menos que isso separadamente.)
Existe um método melhor que também seja preciso (não aproximado)?
fonte
Respostas:
Eu acho que (uma versão ligeiramente modificada) do método 2 é bem direto, na verdade
Usando a definição da função de distribuição Pareto dada na Wikipedia
se você tomar eα=γentão a razão depxparaqx=FX(x+1xm=12 α=γ px qx=FX(x+12)−FX(x−12) x=1 x=1
O método 1 também pode ser adaptado para ser exato, executando o método 1 quase sempre e aplicando outro método para lidar com a cauda. Isso pode ser feito de maneiras que podem ser muito rápidas.
1
2
O remanescente esquerdo pode ser feito por várias abordagens (mesmo com, digamos, 'esquadrando o histograma' se for automatizado, mas não precisa ser tão eficiente quanto isso), e a cauda direita pode ser feita usando algo como a abordagem de aceitação / rejeição acima.
O algoritmo básico envolve a geração de um número inteiro de 1 a 256 (o que requer apenas 8 bits da rng; se a eficiência é primordial, as operações de bits podem tirar aqueles 'fora do topo', deixando o restante do número uniforme (seria melhor esquerda como um valor inteiro não normalizado até este ponto) capaz de ser usado para lidar com o remanescente esquerdo e a cauda direita, se necessário.
No mesmo exemplo zeta (2) que acima, você teria 212
1
, 262
, 73
, 34
, 15
e os valores de 250-256 lidariam com o restante. Mais de 97% do tempo você gera um dos valores na tabela (1-5).fonte
fonte