Еще одно простое моделирование случайного блуждания с использованием Python ( Двумерный)

Я пытаюсь решить двумерную задачу случайного блуждания из книги, исследуя python. Но я не мог понять, как решить эту проблему. Я провел небольшое исследование, но оно было слишком сложным, чтобы понять, о чем идет речь. Я начинающий учиться. Итак, я не могу понять код, глядя на него. Пожалуйста, подробно объясните мне эту проблему.

В любом случае, вопрос таков:

Двумерная вариация случайного блуждания начинается в середине. сетки, например массива 11 на 11. На каждом шагу у пьяницы по четыре выбор: вверх, вниз, влево или вправо. Ранее в этой главе мы описали как создать двумерный массив чисел. Используя эти данные типа, напишите симуляцию двумерного случайного блуждания.

Хорошо, что я знаю; Я знаю, как создать двумерный массив в python:

times = [0] * 11
for i in range(0,11):
    times[i] = [0] * 11

И у меня возникла идея функции "randint":

А также недавно я написал одномерный вариант этой проблемы. Но это спагетти-код, и он очень грязный, и я не уверен, что он правильный.

Мой код здесь:

'''
Created on Feb 11, 2012

@author: msarialp
'''
from random import randint

def drunken_man():
    steps = 0
    times = [0] * 11
    left_move = 0
    right_move = 0
    i = 0
    while left_move < 5 or right_move < 5:
        value = randint(0,1)
        times[5] = 1
        if value == 1:
            steps += 1
            print("He moved left")
            left_move += 1
            if right_move > 0:
                right_move -= 1
            if left_move == 1:
                times[4] += 1
            elif left_move == 2:
                times[3] += 1
            elif left_move == 3:
                times[2] += 1
            elif left_move == 4:
                times[1] += 1
            #elif left_move == 5:
                #times[0] += 1
        elif value == 0:
            steps += 1
            print("He moved right")
            right_move += 1
            if left_move > 0:
                left_move -= 1
            if right_move == 1:
                times[6] += 1
            elif right_move == 2:
                times[7] += 1
            elif right_move == 3:
                times[8] += 1
            elif right_move == 4:
                times[9] += 1
            #elif right_move == 5:
                #times[10] += 1
        times[i] += 1                
    for i in range(1,10):
        print("He took {steps} steps until he reaches end of the sidewalk.".format(steps = steps),  "He stood on {1} square at {0} times".format(times[i], i) )

def main():
    drunken_man()

    return 0
if __name__ == '__main__':
    main()

ИЗМЕНИТЬ Один

После нескольких хороших советов от Дэна Герхардссона. Решил отредактировать свой вопрос. Итак, где я нахожусь по этому вопросу: Я понимаю, как я могу проследить и изучить шаги моего пьяного человека в двумерном измерении.

Было очень понятно и понятно использовать кортеж для решения этого упражнения.

Итак, после того, как весь мой фрагмент кода здесь, пожалуйста, проверьте и дайте мне отзывы.

def two_dimensional_random_walk():
    steps = 0
    times = [0] * 11
    for i in range(0,11):
        times[i] = [0] * 11
    x = 5
    y = 5
    moves = [(1,0), (0,1), (-1,0), (0,-1)]  
    while x<11 and x >= 0 or y < 11 and y >= 0:  
        dx, dy = moves[randint(0,3)]
        x += dx
        y += dy
        if dx == 1 and dy == 0:
            print("He moved right")
        elif dx == 0 and dy == 1:
            print("He moved up")
        elif dx == -1 and dy == 0:
            print("He moved left")
        elif dx == 0 and dy == -1:
            print("He moved down")
        try:
            times[x][y] += 1
            steps += 1
        except IndexError:
            break

А моя функция печати:

for i in range(0,11):
    for j in range(0,11):
        print("He took {steps} steps until he reaches end of the sidewalk.".format(steps = steps),  "He stood on {1}x{2} square at {0} times".format(times[i][j], i+1,j+1) )   

В общем, я думаю, с помощью Дэна Герхардссона я решил это упражнение.

Но почему я не могу изменить свое одномерное решение с помощью этих подсказок?

def drunken_man():
steps = 0
x = 6
times = [0] * 11
moves = [(1), (-1)]

while x < 11 and x >= 0:
    dx = moves[randint(0,1)]
    print(dx, x)
    x += dx
    try:
        times[x] += 1
        steps += 1
    except IndexError:
        break           
for i in range(1,11):
    print("He took {0} steps until he reaches end of the sidewalk.".format(steps),  "He stood on {1} square at {0} times".format(times[i], i) )

РЕДАКТИРОВАТЬ Два (Последние штрихи)

Я не уверен, нужно ли редактировать мой пост для применения советов Дэна Герхардссона. Чтобы помочь кому-то, кому не хватает очков, как я, я решил объединить все вместе.

Итак, вот моя функция, которая сочетается с подсказками Дэна Герхардссона:

def two_dimensional_random_walk():
steps = 0 # Steps counter for understand how many steps that our drunken man take
grid_size = 11 # Grid size variable,
# Creating Two dimensional array by using lists
times = [0] * grid_size 
for i in range(0,grid_size):
    times[i] = [0] * grid_size
# Initial variables to start in the middle of grid
x = 5
y = 5
# Tuples to get directions and decide where to go
moves = [(1,0, "right"), (0,1, "up"), (-1,0, "left"), (0,-1, "down")] 
# My loop for evaluate the steps
while True:  
    dx, dy, position = moves[randint(0,3)] # By using randint I could make decision randomly
    x += dx
    y += dy
    print("He moved", position)
    try:
        times[x][y] += 1 # And here is, how many times have he stood on each square
        steps += 1
    except IndexError: # The exit of loop
        break
# My print function which answers these questions (How long will it be until he reaeches the end of the sidewalk, and how many times will he have stood on each square)
for i in range(0,11):
    for j in range(0,11):
        print("He took {steps} steps until he reaches end of the sidewalk.".format(steps = steps),  "He stood on {1}x{2} square at {0} times".format(times[i][j], i+1,j+1) )

Спасибо за вашу большую помощь Дэну Герхардссону. Думаю, наконец, у меня есть решение.

7
задан mustafaSarialp 25 February 2012 в 08:25
поделиться