0

グリッド内の行と列の数を取り、グリッドの中心から始まるランダム ウォークをシミュレートし、ランダム ウォークが各交差点を訪れた回数を計算する関数を作成しようとしています。次に、ランダムウォークがグリッドの外に移動すると、テーブルを1行ずつ印刷します。これまでのところ、これはありますが、正しく機能しません。

def manhattan(x,y):
    'int,int==>nonetype'
    import random
    res=[]
    for i in range(x):
        res.append([])
    for i in res:
        for j in range(y):
            i.append(0)
    position=(x//2+1,y//2+1)
    z=position[0]
    v=position[1]

    while z!=-1 or z!=x or v!=-1 or v!=y:
        direction=random.randrange(1,5)
        if direction==1:
            v+=1
        elif direction==2:
            z+=1
        elif direction==3:
            v-=1
        else:
            z-=1
        for i in range(len(res)):
            if i ==z:
                res[i]+=1
            for j in range(i):
                if v==j:
                    i[j]+=1
    for i in res:
        print(i)

完了すると、次のようになります。

manhattan(5,11)
[0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,1,1,1,1,2,2]
[0,0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0,0]
4

2 に答える 2

1

あなたは非常に近かったです、次のことを試してください:

def manhattan(x,y):
    'int,int==>nonetype'
    import random
    res=[]
    for i in range(x):
        res.append([])
    for i in res:
        for j in range(y):
            i.append(0)
    position=(x//2+1,y//2+1)
    z=position[0]
    v=position[1]

    while z!=-1 and z!=x and v!=-1 and v!=y:
        res[z][v] += 1
        direction=random.randrange(1,5)
        if direction==1:
            v+=1
        elif direction==2:
            z+=1
        elif direction==3:
            v-=1
        else:
            z-=1
    for i in res:
        print(i)

ループまでは何も変わっwhileておらず、いくつかの変更しかありません。これらの条件のいずれかが満たされた場合に終了するため、最初にループ条件チェックのand代わりに使用する必要があります。or

もう 1 つの変更は、forループの下部からループを削除し、whileに置き換えることでしたres[z][v] += 1。これは、zとが交点を表し、すべての交点の 2 次元リストになるようにv既に初期化されているため、ループは不要です。resまた、これをループの先頭に移動しました。そうしないとres、境界を越えて移動した後に変更しようとする可能性があるためです。

于 2013-06-04T17:30:46.527 に答える
1

random.choiceこれは、連鎖elifステートメントの代わりに使用する、少し冗長なバージョンです。Python を学習するときに、同じ問題をさまざまな方法で見ることが役立つことがわかったので、ここでは純粋な Python とnumpy+ Python の実装を示します。

ピュアパイソン

import random

def manhattan(n,m):
    grid = [[0,]*m for _ in xrange(n)]
    directions = [[-1,0],[1,0],[0,-1],[0,1]]
    pt = [n//2, m//2]

    while pt[0]>=0 and pt[0]<n and pt[1]>=0 and pt[1]<m:
        grid[pt[0]][pt[1]] += 1
        d  = random.choice(directions)
        pt[0] += d[0]
        pt[1] += d[1]
    return grid

for row in manhattan(5,11):
    print row

これは、例えば、

[0, 0, 0, 1, 3, 3, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 3, 3, 2, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0]
[0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0]

Python + numpy

import numpy as np
import random

def manhattan(n,m):
    grid = np.zeros((n,m),dtype=int)
    directions = [[-1,0],[1,0],[0,-1],[0,1]]
    pt   = np.array([n//2, m//2])

    while (pt>=0).all() and (pt<grid.shape).all():
        grid[pt[0],pt[1]]  += 1      
        pt += random.choice(directions)
    return grid

print manhattan(5,11)
于 2013-06-04T19:27:54.170 に答える