2015-09-30 9 views
5

Mam problem ze średnią odległością w tym ćwiczeniu. Powinien być zbliżony do sqrt N kroków, ale jest niższy. Czy możesz mi pomóc dowiedzieć się, gdzie jest mój błąd?Proste 2D Losowy spacer

2D losowy spacer. Dwuwymiarowy przypadkowy spacer symuluje zachowanie cząstki poruszającej się w siatce punktów. Na każdym kroku, przypadkowy chodzik porusza się na północ, południe, wschód lub zachód z prawdopodobieństwem 1/4, niezależnie od poprzednich ruchów. Określ, jak daleko (przeciętnie) znajduje się przypadkowy chodzik od punktu początkowego po N krokach. (odpowiedź teoretyczna. Na zlecenie sqrt (n))

public class RandomWalk{ 
    public static void main(String[] args){ 

    int N = Integer.parseInt(args[0]); 

    double nextStep = 0; 
    double averageDistance = 0; 
    int COUNT = 1000; 

    for (int j = 0; j < COUNT; j++){ 
     int moveWest = 0; 
     int moveEast = 0; 
     int moveSouth = 0; 
     int moveNorth = 0; 
     double distance = 0; 

     for (int i = 0; i < N; i++){ 
     nextStep = Math.random()*4; 
     if (nextStep <= 1) ++moveWest; 
      else if (nextStep <= 2) ++moveEast; 
      else if (nextStep <= 3) ++moveSouth; 
       else if (nextStep <= 4)++moveNorth;  
     } 

     moveEast = moveEast - moveWest; 
     moveNorth = moveNorth - moveSouth; 
     distance = Math.sqrt((moveEast * moveEast) + (moveNorth * moveNorth)); 
     averageDistance += distance; 

     System.out.println("Walker is " + distance + "\t steps away of from the starting point"); 
     //System.out.println("Sqrt of N is " + Math.sqrt(N)); 

    } 
    System.out.println("Average distance is " + averageDistance/COUNT + " steps away of from the starting point"); 
    } 
} 
+0

Zasięg od <0,1> jest większy niż (3,4>, więc zacznę od zrobienia ich nawet przy użyciu wszędzie mniej niż porównania. Testowałem to, ale nie wprowadziłem znaczących zmian, nadal ... zacznij od tego. – zubergu

+1

Nie sądzę, że ma on zbiegać się do sqrt (N) lub coś podobnego. Ma on być rzędu wielkości sqrt (N) lub niektórych takich. Lub mb O (sqrt (N)). Matematyka ... –

+0

Potem myślę, że moje rozwiązanie jest właściwe? –

Odpowiedz

3

wpadłem kilka testów na kodzie z ww zmianą zakresów < 0,1), 1,2 <), < 3,3), < 3,4) czyniąc je równymi.

I to zrobić tak:

if (nextStep < 1) ++moveWest; 
      else if (nextStep < 2) ++moveEast; 
      else if (nextStep < 3) ++moveSouth; 
       else if (nextStep < 4)++moveNorth; 

Wskazówka < = staje <.

100000 procesy 100 kroków wydały te resutls:

Average distance is 8.873435509749317 steps away of from the starting point 
W=2498906 
E=2501447 
N=2500022 
S=2499625 

, w którym W, X, Y, S są sumowane czynności dla danego kierunku, podczas wszystkich prób. Wyglądają dobrze.

Przeprowadzenie takiego przypadku testowego kilka razy pokazuje, że nie ma preferowanego kierunku. Możesz użyć innych metod, aby uzyskać losowe liczby, ale to będzie testowanie generatorów, a nie twojego przypadku. Twój kod wygląda dobrze z mojego punktu widzenia.

Zdanie z oświadczeniem problemu daje również pojęcia: teoretyczna odpowiedź: na kolejności sqrt (N).

+0

Dziękuję. Angielski nie jest moim ojczystym językiem, więc czasami nie rozumiem wszystkich szczegółów. –

+0

@zubergu: Nitpicking: * jeśli * się nie mylę, [Math.random] (http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#random%28% 29) 'zwraca podwójną wartość ze znakiem dodatnim, większym lub równym 0.0 i mniejszym niż 1.0', aka' [0.0, 1.0) ', więc oryginalny kod OP dzieli go na' [0.0, 1.0], (1.0, 2,0], (2,0, 3,0), (3,0, 4,0) '. –

+1

@TobiaTesan Dokładnie, i przełączając się z mniejszej lub równej wartości, mniej niż robisz wszystkie zakresy, tak więc jest otwarty na jednym końcu i zamknięty na innym. Edytuję i podaję przykład kodu, aby to wyjaśnić. – zubergu

1

Myślę, że ta linia nie będzie działać:

nextStep = Math.random()*4; 

wyjaśnienie jest logiczna. Myślę, że lepiej byłoby używać liczb całkowitych do twoich celów, ponieważ chcesz obliczyć krokami, które są jednostkami statycznymi. Na tym opiera się opinia, ale zalecam liczyć pełną liczbę kroków zamiast śledzić częściowe kroki.

spróbować zamiast:

Random rand = new Random(); 
nextStep = rand.nextInt(4)+1; //random numbers {1,2,3,4} 

Ponadto od nextInt() generuje losowe Integer wartości trzeba użyć operatora zamiast <=== w swoim if/else.

if (nextStep == 1) ++moveWest; 
      else if (nextStep == 2) ++moveEast; 
      else if (nextStep == 3) ++moveSouth; 
       else if (nextStep == 4)++moveNorth;  

odniesieniu do Tom (nie ja jeden w komentarzach!)

+0

Nie rozumiem twojego rozumowania, czy rozwiniesz trochę więcej? –

+0

Zauważ, że OP ma 'if (nextStep <= 1)' etc –

+0

@TomWellbrock: teraz jestem * bardziej * zaintrygowany. 'Math.random() * (4 - 0);' powinien być dokładnie taki sam (jak w kompilacji do tego samego kodu bajtowego). czego mi brakuje? –