Вероятность возврата к началу координат для трехмерного случайного блуждания
Вот мой код, имитирующий код в Python, имитирующий случайное блуждание в 3 измерениях. Возвращает процентное количество раз, когда прогулка возвращается к началу координат. Константа Поли составляла ~ 34% вероятности того, что прогулка вернется к исходной точке в трех измерениях. Мой процент составляет всего 11-12%. Если я умножу на три (как предположение), ответ станет довольно близким к константе Поли, но в большинстве случаев он будет ближе к 36%. Пожалуйста, дайте мне знать, что ошибка в моей математике, логике или кодировании для этой проблемы. Заранее спасибо.
def r3walk(T):
x = np.zeros((T))
y = np.zeros((T))
z = np.zeros((T))
count = 0
for t in range(1,T):
walk = random.uniform(0.0,1.0)
if 0 < walk < 1/float(6):
x[t] = x[t-1] + 1
elif 1/float(6) < walk < 2/float(6):
x[t] = x[t-1] - 1
elif 2/float(6) < walk < 3/float(6):
y[t] = y[t-1] + 1
elif 3/float(6) < walk < 4/float(6):
y[t] = y[t-1] - 1
elif 4/float(6) < walk < 5/float(6):
z[t] = z[t-1] + 1
else:
z[t] = z[t-1] - 1
for t in range(1,T):
if [x[t],y[t],z[t]] == [0,0,0]:
count += 1
return count/float(T)
Отредактированный код:
def r32walk(T):
x = np.zeros((T))
y = np.zeros((T))
z = np.zeros((T))
count = 0
for t in range(1,T):
walk1 = random.uniform(0.0,1.0)
if walk1 > 0.5:
x[t] = x[t-1] + 1
else:
x[t] = x[t-1] - 1
for t in range(1,T):
walk2 = random.uniform(0.0,1.0)
if walk2 > 0.5:
y[t] = y[t-1] + 1
else:
y[t] = y[t-1] - 1
for t in range(1,T):
walk3 = random.uniform(0.0,1.0)
if walk3 > 0.5:
z[t] = z[t-1] + 1
else:
z[t] = z[t-1] - 1
for t in range(1,T):
if [x[t],y[t],z[t]] == [0,0,0]:
count += 1
#return x,y,z
return count/float(T) * 100
1 ответ
Я подошел к этому как к проблеме моделирования Монте-Карло; сделайте большое количество случайных блужданий и посмотрите, какая пропорция вернется к исходной точке в течение большого количества шагов. Самая простая реализация - это одна функция для выполнения одной прогулки и вторая для выполнения повторения.
import random
def simulation(dimensions, repeats, steps):
"""Simulate probability of returning to the origin."""
return sum(random_walk(dimensions, steps)
for _ in range(repeats)) / float(repeats)
def random_walk(n, s):
"""Whether an n-D random walk returns to the origin within s steps."""
coords = [0 for _ in range(n)]
for _ in range(s):
coords[random.randrange(n)] += random.choice((1, -1))
if not any(coords):
return True
return False
print [simulation(3, 100, 1000) for _ in range(10)]
Чем больше steps
а также repeats
становиться (т.е. чем ближе мы подходим к "реальной" ситуации, все возможные прогулки с бесконечным числом шагов), тем меньшую изменчивость результатов я бы ожидал. За показанные числа я получаю:
[0.33, 0.36, 0.34, 0.35, 0.34, 0.29, 0.34, 0.28, 0.31, 0.36]