Recentemente assisti ao vídeo A company posted this interesting question. Can you solve it?. Ele possui a seguinte pergunta central:

If two points are picked at random uniformly along the border of a square, what’s the probability the distance between them is larger than the side length of the square?

Traduzindo para o português,

Se dois pontos são escolhidos ao acaso de maneira uniforme em cima da borda de um quadrado, qual é a probabilidade da distância entre eles ser maior do que o comprimento do lado do quadrado?

Ou seja, a ideia é verificar qual a probabilidade dos comprimentos dos segmentos laranja da ilustração abaixo serem maiores do que o comprimento do lado do quadrado onde os pontos são escolhidos.

A imagem abaixo mostra nove destes casos. A ideia é encontrar a probabilidade de linhas laranjas como estas, que unem os pontos, serem maiores do que o lado do quadrado.

De acordo com o vídeo, a resposta é

$$\frac34 - \frac{\pi}{8} \approx 0.357301.$$

Aqui vou criar uma simulação de Monte Carlo para responder a esta pergunta de forma numérica.

Sem perda de generalidade, vamos supor que o lado \(l\) do quadrado é igual a 1. Vou repetir este experimento \(n = 1000000\) vezes, para que eu obtenha uma boa estimativa.

l <- 1
n <- 1000000

Vou criar um objeto vazio chamado distancia, onde armazenarei cada uma das distâncias calculadas.

distancia <- rep(NA, n)

A parte mais complexa acaba sendo gerar os números aleatórios para encontrar os pontos nos lados dos quadrados. Embora eles sigam uma distribuição uniforme, eu não posso simplesmente gerar dois números aleatórios uniformes para cada ponto, pois preciso condicioná-los a estarem em cima dos lados dos quadrados. Para resolver isto, fiz o seguinte para cada ponto \(A\):

  1. Gerei um vetor de duas posições
  2. A primeira posição é um número igual a 0 ou \(l\)
  3. A segunda posição é um aleatório entre 0 e \(l\)
  4. A ordem das posições dos elementos do vetor foi aleatorizada

Assim, eu tenho a garantia de que uma das posições do ponto \(A\) é 0 ou \(l\), fazendo com que ele esteja, com certeza, em cima de um dos lados de um quadrado de lado \(l\) com o vértice inferior esquerdo localizado na origem do meu sistema de coordenadas.

Os valores das coordenadas para o ponto \(b\) foram geradas da mesma maneira.

Desta forma, tenho o seguinte algoritmo, rodado \(n = 1000000\) vezes:

for (j in 1:n){
  A <- sample(c(sample(c(0, l), 1), runif(1, 0, l)))
  B <- sample(c(sample(c(0, l), 1), runif(1, 0, l)))
  
  distancia[j] <- dist(matrix(c(A, B), ncol = 2, byrow = TRUE))
}

sum(distancia > l)/n
## [1] 0.356688

Como é possível ver, estimei o valor 0.356688 para a probabilidade estimada para o problema, um valor muito próximo de \(\frac34 - \frac{\pi}{8} \approx 0.357301\), que é o valor nomimal calculado.