Eu estava tentando simular a injeção de pontos aleatórios dentro de um círculo, de forma que qualquer parte do círculo tivesse a mesma probabilidade de ter um defeito. Eu esperava que a contagem por área da distribuição resultante seguisse uma distribuição de Poisson se eu dividir o círculo em retângulos de área iguais.
Como requer apenas a colocação de pontos dentro de uma área circular, injetei duas distribuições aleatórias uniformes em coordenadas polares: (raio) e (ângulo polar).θ
Mas depois de fazer essa injeção, eu claramente recebo mais pontos no centro do círculo em comparação com a borda.
Qual seria a maneira correta de executar essa injeção no círculo, de modo que os pontos sejam distribuídos aleatoriamente no cirlce?
random-generation
circular-statistics
Jonjilla
fonte
fonte
Respostas:
Você deseja que a proporção de pontos seja uniformemente proporcional à área e não à distância da origem. Como a área é proporcional à distância ao quadrado, gere raios aleatórios uniformes e tome suas raízes quadradas. Combine isso com um ângulo polar uniforme.
É rápido e simples de codificar, eficiente na execução (especialmente em uma plataforma paralela) e gera exatamente o número prescrito de pontos.
Exemplo
Este é um
R
código funcional para ilustrar o algoritmo.fonte
A amostragem por rejeição pode ser usada. Isso significa que podemos amostrar a partir da distribuição uniforme 2D e selecionar amostras que atendam às condições do disco.
Aqui está um exemplo.
fonte
Darei a você uma resposta n-dimensional geral que também funciona para casos bidimensionais, é claro. Em três dimensões, um análogo de um disco é o volume de uma bola sólida (esfera).
Existem duas abordagens que vou discutir. Um deles eu chamaria de "preciso" , e você obterá uma solução completa com ele em R. O segundo eu chamo de heurística , e é apenas a idéia, nenhuma solução completa é fornecida.
Solução "precisa"
Minha solução é baseada nos trabalhos de Marsaglia e Muller . Basicamente, isso acontece para que o vetor gaussiano normalizado de acordo com sua norma lhe desse pontos distribuídos uniformemente em uma hiperesfera d-dimensional:
Aqui está um trecho de código para o caso 3d, ou seja, uma bola sólida:
Abordagem heurística
fonte
Aqui está uma solução alternativa em
R
:fonte
r <- seq(0, 1, by=1/10)
r
de Uniform (0,1).