Une Simple Marche Aléatoire De La Simulation À L'Aide De Python(En Deux Dimensions)
J'essaie de résoudre en deux dimensions, la marche aléatoire problème du livre, en explorant python.
Mais, je ne pouvais pas imaginer comment puis-je résoudre ce problème.J'ai fait quelques recherches mais ceux-ci étaient trop compliqués à comprendre de quoi il s'agit. Je suis un débutant de l'apprenant. Donc, je ne comprends pas le code par la recherche. Merci de m'expliquer ce problème dans les détails.
De toute façon, la question est:
Les deux dimensions de la variation sur la marche aléatoire démarre au milieu
d'une grille, comme un 11 par 11 tableau. À chaque étape de la bu a quatre
choix: le haut, le bas, la gauche ou la droite. Plus tôt dans ce chapitre, nous avons décrit
comment créer un tableau à deux dimensions de nombres. L'utilisation de ces données
type, écrire une simulation des deux dimensions de marche aléatoire.
Ok, Ce que je sais;
Je sais comment créer tableau à deux dimensions en python:
times = [0] * 11
for i in range(0,11):
times[i] = [0] * 11
Et j'ai eu l'idée de "randint" fonction:
Et j'ai également écrit une variation dimensionnelle de ce problème récemment. Mais c'est un code spaghetti code et et c'est très sale et aussi je ne suis pas sûr si c'est la droite.
Mon code est ici:
'''
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()
MODIFIER Un
Après la prise de certains bons conseils de Dan Gerhardsson.
J'ai décidé de modifier ma question.
Alors, où je suis sur cette question:
Je comprends comment puis-je suivre et d'examiner les étapes de mon homme ivre à deux dimesion.
C'était très compréhensible et clair pour utiliser un tuple à résoudre cet exercice.
Donc, après tout mon segment de code est ici, Merci de vérifier et de me donner des retours.
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
Et ma fonction d'impression est:
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) )
Donc dans l'ensemble je suppose qu'avec l'aide de Dan Gerhardsson, j'ai résolu l'exercice.
Mais, Pourquoi je ne parviens pas à modifier mon unidimensionnel solution avec ces conseils.
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) )
ÉDITER Deux(touche Finale)
Je ne suis pas sûr de savoir si il est nécessaire d'éditer mon post pour appliquer les conseils de Dan Gerhardsson. Afin d'aider quelqu'un qui manque de points comme moi, j'ai décidé de combiner le tout.
Donc voici ma fonction qui est combiné avec des notes par Dan Gerhardsson:
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) )
Merci pour votre grande aide Dan Gerhardsson.
Je pense enfin j'ai la solution.
- Est-ce devoirs?
- Non, je suis juste étudiant python avec ce livre, books.google.com.tr/books/about/...
Vous devez vous connecter pour publier un commentaire.
Je peux au moins vous donner quelques conseils. Donc, vous avez quatre coups. Chaque mouvement peut être représenté par un tuple qui est le déplacement dans les directions x et y:
Pour définir la position de départ du centre:
Stocker la position de l'homme ivre et mettre à jour à chaque étape de la simulation. Quelque chose comme ceci:
Cela pourrait ne pas être débutant niveau du code, mais au lieu de vérifier les limites avec un if, vous pouvez essayer de mettre à jour le comte, et de gérer l'exception, qui est déclenchée si la position est en dehors de la grille:
Espère que cette aide.
ÉDITION - Commentaires sur la deuxième version:
Puisque vous voulez imprimer une direction à chaque étape, vous pouvez l'ajouter à la n-uplet:
Ensuite, vous pouvez remplacer le if où l'impression de la direction:
Lorsque vous utilisez essayez-sauf que dans votre solution actuelle, vous n'avez pas besoin de vérifier les limites dans le while. Il vous suffit de faire:
depuis la rupture dans le gestionnaire d'exception quitter la boucle.
Mon dernier conseil est de remplacer en partie le nombre de littéraux avec des variables. La taille de la grille par exemple, apparaît dans plus d'un endroit. Vous devez créer une variable et s'y référer dans le reste du code:
À l'aide d'une variable au lieu de nombre de littéraux signifie que vous avez juste à faire un changement à un seul endroit, si vous voulez exécuter le code avec une autre grille de taille.
J'ai fait une similaire marche aléatoire programme qui a permis à l'homme ivre de marcher dans n'importe quelle direction dans l'espace à trois dimensions à l'aide de coordonnées sphériques.