0

这是我在 python 中模拟 3 维随机游走的代码的代码。它返回步行返回原点的百分比。Polya 的常数是步行返回 3 维原点的概率约为 34%。我的百分比只有 11-12%。如果我乘以三(作为猜测),答案变得相当接近 Polya 的常数,但大多数时候看起来更接近 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
4

1 回答 1

2

我将其视为蒙特卡洛模拟问题;做大量的随机游走,看看在一些大量的步内有多少比例回到原点。最简单的实现是一个函数进行一次步行,第二个函数进行重复。

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)]

越大stepsrepeats变得越多(即我们越接近“真实”情况,所有可能的步行都具有无限的步数),我期望的输出变化越小。对于显示的数字,我得到:

[0.33, 0.36, 0.34, 0.35, 0.34, 0.29, 0.34, 0.28, 0.31, 0.36]
于 2014-07-28T22:33:49.413 回答