2016-09-20 2 views
-2

난 그냥 파이썬을 배우기 시작하고 3 차원에서 무작위 도보의 새로운 위치를 인쇄하는 데 문제가있다. 오류가 나타나지 않지만 인쇄되는 출력 (x, y, z)이 부당하다는 것은 명백합니다! 단계별로 무작위 걸음을 시뮬레이트 할 때마다 매번 (x, y, z)의 값 하나만 변경해야한다고 가정합니다. 그러나 그것은 결과물에없는 것처럼 보입니다. 나는 그것을 디버깅하려고하지만 여전히 실제 문제가 무엇인지 식별하는 것에 대해 혼란 스럽다.python 3에서 무작위로 걷는 이상한 결과?

출력의 헤드 라인 :

(0,-1,1) 
(-1,0,1) 
(-2,0,1) 
(-2,1,2) 
(-2,2,2) 
(-2,2,3) 
(-1,2,3) 
(0,1,3) 

내 의욕 :

이 코드의 목적은 3 차원 랜덤 워크 (random walk)의 N 단계를 시뮬레이션하는 것입니다. 각 단계에서 임의의 방향 (북, 남, 동, 서, 위, 아래)이 선택되고 크기 1의 단계가 그 방향으로 가져옵니다. 그러면 새 위치가 인쇄됩니다. 시작 위치는 원점 (0, 0, 0)입니다.

내 코드 :

import pdb 
import random # this helps us generate random numbers 
N = 30 # number of steps 
n = random.random() # generate a random number 

x = 0 
y = 0 
z = 0 
count = 0 
while count <= N: 
    if n < 1/6: 
     x = x + 1   # move east 
     n = random.random() # generate a new random number 
    if n >= 1/6 and n < 2/6: 
     y = y + 1   # move north 
     n = random.random() # generate a new random number 
    if n >= 2/6 and n < 3/6: 
     z = z + 1   # move up 
     n = random.random() # generate a new random number 
    if n >= 3/6 and n < 4/6: 
     x = x - 1   # move west 
     n = random.random() # generate a new random number 
    if n >= 4/6 and n < 5/6: 
     y = y - 1   # move south 
     n = random.random() # generate a new random number 
    if n >= 5/6: 
     z = z - 1   # move down 
     n = random.random() # generate a new random number 

    print("(%d,%d,%d)" % (x,y,z)) 
    count = count + 1 
print("squared distance = %d" % (x*x + y*y + z*z)) 

환경 :

Jupyter 노트북에 파이썬 3.5, 윈도우 10, 델 XPS 13

+0

참고 파이썬에서'n> = 2/6과 n <3/6'은'2/6 <= n <3/6' 철자가 될 수 있습니다. – Eric

답변

2

당신은 모든 if에 새로운 난수로 n 설정 테스트 :

if n < 1/6: 
    x = x + 1   # move east 
    n = random.random() # generate a new random number 

이것은 다음if 테스트가 새로운 n과 일치 할 수도 있음을 의미하며, 단계 당 하나 이상의 변경을 제공합니다.

n = random.random() 단계를 루프의 상단 단계로 이동하여 단계 당 한 번만 생성하십시오.

N = 30 # number of steps 

x = 0 
y = 0 
z = 0 

for count in range(N): 
    n = random.random() # generate a new random number 
    if n < 1/6: 
     x = x + 1   # move east 
    elif n < 2/6: 
     y = y + 1   # move north 
    elif n < 3/6: 
     z = z + 1   # move up 
    elif n < 4/6: 
     x = x - 1   # move west 
    elif n < 5/6: 
     y = y - 1   # move south 
    else: 
     z = z - 1   # move down 

    print("(%d,%d,%d)" % (x,y,z)) 

가 나는 또한 range() 통해 for 루프를 사용하여 전환 그래서 당신은 수동으로 증가하고 테스트 count 필요가 없습니다 : 당신은 아마 너무 많은 시험을 방지하기 위해뿐만 아니라 elif를 사용하고 싶습니다.

이 상기 랜덤 그리스트의 인덱스를 선택하는 random.range()을 지시를 저장 목록을 사용하여 간략화 될 수 있으며, random.choice()는의 스텝 변경 어떤 방향 선택하기 :

N = 30 # number of steps 

pos = [0, 0, 0] 

for count in range(N): 
    index = random.randrange(3) # generate a new random index 
    change = random.choice([-1, 1]) 
    pos[index] += change 

    print(tuple(pos)) 
+1

'% pos'는'% tuple (pos)'이어야합니다. 형식 오류로 인해 목록이 언팩되지 않기 때문에 TypeError가 발생합니다. – Eric

+0

또는 튜플을 직접 인쇄하십시오. –