Onde o bêbado para?

Pequeno experimento, baseado no Andar do Bêbado (Random Walk).

Um bêbado começa do ponto (0,0), e anda aleatoriamente um passo para direita ou esquerda no eixo X, e para cima ou para baixo no eixo Y.

O percurso percorrido tem a aparência a seguir, e já fiz experimentos anteriores a respeito. Vide https://ideiasesquecidas.com/2024/06/26/pequeno-exercicio-sobre-random-walk/.

O experimento aqui é um pouquinho diferente? Depois de N passos, onde o bêbado para?

A ideia é baseada num comentário de Richard Hamming:

  • Se você andar aleatoriamente como um bêbado, você vai parar em algum lugar num raio de raiz(N) passos da onde começou
  • Se você tiver um objetivo e andar em direção a este, mesmo bêbado, vai ter percorrido próximo a N (imagine o mesmo bêbado caminhando em direção à uma moça muito bonita)

Bom, vamos ao experimento.

Vamos fazer o bêbado andar 500 passos, em duas dimensões, e guardar a posição final em que ele parou. Faremos isso muitas vezes, e vamos encontrar a média e o desvio padrão.

import random
import numpy as np

trials = 4000
passos = 500

posicao_final = []

for _ in range(trials):
posicao_x = 0
posicao_y = 0
for _ in range(passos):
passo_x = 1 if random.random() < 0.5 else -1
passo_y = 1 if random.random() < 0.5 else -1
posicao_x += passo_x
posicao_y += passo_y
posicao_final.append((posicao_x, posicao_y))

Calcular a média e o desvio padrão

media_x = sum(x[0] for x in posicao_final) / trials
media_y = sum(x[1] for x in posicao_final) / trials
media = (media_x, media_y)

rms = np.sqrt(np.mean([x[0]2 + x[1]2 for x in posicao_final]))
print(media, rms)

Resultado:

(-0.310, 0.301) 31.42

O resultado teórico é que a média é zero, e desvio padrão raiz(N)*p, onde p é o tamanho do passo.

Como o bêbado anda uma unidade no eixo X e uma no eixo Y, na diagonal o tamanho do passo dele é raiz(2).

Se foram 500 passos, então raiz(2*500) = 31.62 passos, bate com o resultado prático.

Vamos plotar as posições num gráfico, para ver como fica. O círculo vermelho é o raio do desvio padrão, ou seja, a maior parte do tempo, o bêbado vai parar dentro deste círculo.

Outra forma de ver é olhando para o histograma da posição final. Neste caso, estou pegando apenas a dimensão X.

Random walks foram bastante estudados, e alguns resultados firmes são:

  • Em uma dimensão (1D) e duas dimensões (2D): Um random walk SEMPRE retorna à origem (média das posições zero).
  • Em mais dimensões (3D, 4D, etc.): A probabilidade de retorno à origem não é garantida e, na verdade, diminui com o aumento da dimensão. Em 3D, há 34% do bêbado voltar para casa, e 66% de chance dele se perder para sempre.

Uma interpretação intuitiva é que, quanto mais dimensões, mais fácil o bêbado se perder, por ele ter mais possibilidades de caminhos.

Portanto, Hamming estava certo ao afirmar que o bêbado não vai muito longe ao andar aleatoriamente.

Mesmo com aleatoriedades, o fato de ter um objetivo e não andar para qualquer lado já significa que você vai muito mais longe!

Código no Github: https://github.com/asgunzi/Andar_bebado_raio

Obs. Pequenos detalhes teóricos.

No cálculo de desvio padrão abaixo, considero que a média é zero.

rms = np.sqrt(np.mean([x[0]2 + x[1]2 for x in posicao_final]))

Além disso, a minha primeira abordagem estava ligeiramente errada, e é bom pontuar a diferença.

Eu estava calculando a distância para a origem em cada trial, e calculando o desvio padrão, como abaixo:

distancia_final = [np.sqrt(x[0]** 2 + x[1] ** 2) for x in posicao_final]
desvio_padrao = np.std(distancia_final)

Parece a mesma coisa, mas a diferença é que eu estava calculando a raiz em cada passo e depois calculando o desvio. O resultado teórico é relativo à distância RMS (Root Mean Square Distance), que é exatamente à da fórmula correta.

Deixe um comentário