2014-11-08 2 views
5

주어진 크기의 사각형을 통해 무작위 경로를 생성하는 코드를 작성하고 싶습니다.사각형을 통한 임의의 경로

나는 점 (0,0)에서 시작 up 또는 rightxlimylim에 도달하기 위해 이동합니다.

다음

내 코드는,

y = 10; 
x = 10; 
yOld = 0; 
xOld = 0; 
figure 
axis([0 x 0 y]) 
while yOld < y && xOld < x 
    DirectionChange = randi([0 1],1); 
    if DirectionChange == 0 
     yNew = yOld + 1; 
     xNew = xOld; 
    else 
     xNew = xOld + 1; 
     yNew = yOld; 
    end 
    line ([xOld xNew],[yOld yNew],'LineWidth',3);hold on 
    yOld = yNew; 
    xOld = xNew; 
end 
line ([xNew x],[yNew y],'LineWidth',3);hold off 

코드는 while loop을 가지고 있으며, x 중 하나 y이 한계의 도달하면 종료됩니다.

그럼 제대로 작동합니다. x = y.

그러나 y > x 일 경우 경로가 xlim에 더 빨리 도달 할 가능성이 높습니다. x = 10, y = 10 12 개 실행을위한

나는 수 (나는 그것이 다채로운 잘 보이도록 만들어!), 당신이 볼 수 있듯이

enter image description here

enter image description here

, 내가 얻을 x = 10, y = 20 설정 나는 후자의 경우에 무작위성을 잃는다. 그 한계에 도달하는 확률은 x이다.

x~=y의 경우 임의성을 유지하는 방법에 대한 제안이 있으십니까?

감사합니다.

답변

3

당신은 항상 오른쪽에 X 단계를해야하고, Y 단계까지. 따라서 이러한 단계가 포함 된 배열을 인코딩 된 명령어로 만듭니다 (간단한 배열은 여기에서 잘 수행 할 것이고 수평 단계에는 0, 수직 방향에는 1을 사용할 수 있습니다). 그런 다음 배열을 임의로 섞습니다. 이것은 아무런 조정없이 구석 구석에 닿을 가능성이 있으며 모든 가능한 경로도 똑같이 나타날 것입니다 (얻을 수있는만큼 임의적으로).

x = 10; 
y = 20; 
steps = [ zeros(1,x) ones(1,y) ]; 
steps = steps(randperm(x+y)); 

figure 
hold on; 

xOld = 0; 
yOld = 0; 
axis([0 x 0 y]) 
for step = steps, 
    if (step == 1) 
     yNew = yOld + 1; 
     xNew = xOld; 
    else 
     xNew = xOld + 1; 
     yNew = yOld; 
    end 
    line ([xOld xNew],[yOld yNew],'LineWidth',3); 
    yOld = yNew; 
    xOld = xNew; 
end 
line ([xNew x],[yNew y],'LineWidth',3); 
hold off 
2

당신이하고 싶은 것은 P(x increases) = x/(x+y)P(y increases) = y/(x+y)입니다. 이 방법으로 x이 한계에 도달 할 확률은 y이 한계에 도달하는 확률과 같습니다.

예 : 10 ylim 주어진 소정의 xlim 5 및 내용은, 상기 연속 구간 [0,1]에서 난수를 생성한다. 이 난수가 xlim/(xlim+ylim) 인 .333보다 작 으면 xOld을 증가시켜야합니다. 그렇지 않으면 yOld을 늘리십시오.

randi 대신 rand을 사용하십시오.

+0

다른 해결책에 대한 다운 워드를 확신하지 못합니다. 나는 문제가 y가 x의 배수가 아니거나 x> y 일 때 x가 y의 배수가되지 않을 경우 문제가 될 수 있다고 생각합니다. 그렇지 않으면 잘 보입니다. 어떻게 생각해? – Divakar

+0

@Divakar OP가 정수가 아닌 이동을 처리해도 괜찮 으면 솔루션은 괜찮아 보입니다. 두 솔루션 (Arpi/광산과 당신) 간의 차이점은 우리가 이동의 확률 *을 변경하고 이동량 *을 변경하여 어느 한쪽 한계를 맞출 확률을 유지한다는 것입니다. 같은 질문에 대한 두 가지 다른 유효한 해결책. – Luigi

+0

괜찮 았던 것처럼 들리는구나. 그래서, downvote는 어떨까요? 다른 이유가 있습니까? 귀찮게해서 미안해, 그렇지 않으면 너. – Divakar

2

하나의 옵션은 치수 비율에 방향 선택을 조건으로하는 것입니다.

DirectionChange = rand(1); 

if DirectionChange < y/(x+y) 
    yNew = yOld + 1; 
    xNew = xOld; 
else 
    xNew = xOld + 1; 
    yNew = yOld; 
end 

enter image description here

는 어떤 요구 사항이 유지되어야한다 좋으세요? 예 :일정한 스텝 크기

편집 : 더 효과적인 전략은 '벽'을 치는 피하기 위해 :

DirectionChange = rand(1); 

% distance left to the end 
xLeft = x - xOld; 
yLeft = y - yOld; 

if DirectionChange < yLeft/(xLeft+yLeft) 
    yNew = yOld + 1; 
    xNew = xOld; 
else 
    xNew = xOld + 1; 
    yNew = yOld; 
end 
+0

편집 결과가 임의성을 유지하지 않습니다. 오른쪽 상단과 왼쪽 하단 모서리 사이의 대각선에없는 위치에서 한 방향으로 이동할 확률이 적습니다. OP가이 동작을 좋아할 가능성은 있지만, 처음에 사용한 * (*와 *) 메소드가'x <> y' 인 경우에 비례한다고 설명하고 싶습니다. – Luigi

+0

+1 – Luigi

+0

코멘트를 주셔서 감사합니다, 나는 그것을 알고 있지만, OP는 요구 사항을 지정하지 않았다. 내 편집은 여전히 ​​임의성을 유지하지만 비 정적 인 방식으로 유지한다고 생각합니다. – Arpi

관련 문제