2015-09-30 15 views
5

Tôi đang gặp vấn đề với khoảng cách trung bình trong bài tập này. Nó phải gần với sqrt của N bước, nhưng nó thấp hơn. Bạn có thể giúp tôi tìm ra đâu là sai lầm của tôi?Simple 2D Random walk

Đi bộ ngẫu nhiên 2D. Một bước đi ngẫu nhiên hai chiều mô phỏng hành vi của một hạt chuyển động trong một mạng lưới các điểm. Ở mỗi bước, người đi bộ ngẫu nhiên di chuyển về phía bắc, nam, đông hoặc tây với xác suất 1/4, độc lập với các động thái trước đó. Xác định khoảng cách trung bình (trung bình) người đi bộ ngẫu nhiên là từ điểm khởi đầu sau N bước. (câu trả lời lý thuyết:. Vào thứ tự của 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

Phạm vi từ <0,1> lớn hơn (3,4> vì vậy tôi sẽ bắt đầu bằng cách tạo chúng ngay cả khi sử dụng ít hơn so với mọi nơi. Tôi đã thử nghiệm nhưng không thực hiện thay đổi đáng kể, vẫn ... bắt đầu từ đây. – zubergu

+1

Tôi không nghĩ rằng nó được coi là hội tụ để sqrt (N) hoặc bất cứ điều gì như thế. Nó được cho là theo thứ tự độ lớn của sqrt (N) hoặc một số như vậy. Hoặc mb O (sqrt (N)). Math ... –

+0

Sau đó, tôi đoán giải pháp của tôi là đúng? –

Trả lời

3

Tôi chạy một vài thử nghiệm trên mã của bạn với sự thay đổi nói trên của dãy < 0,1), < 1,2), < 2,3), < 3,4) làm cho chúng thậm chí.

Và bạn làm điều đó như thế:

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

Thông báo < = trở <.

100000 thử nghiệm 100 bước mỗi cho những resutls:

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

, nơi W, E, N, S được tóm tắt bước hướng nhất định trong tất cả các thử nghiệm. Chúng trông ổn.

Chạy trường hợp thử nghiệm này một vài lần cho thấy không có hướng thích hợp hơn. Bạn có thể sử dụng các phương pháp khác để có được số ngẫu nhiên, nhưng đó sẽ là thử nghiệm máy phát điện, chứ không phải trường hợp của bạn. Mã của bạn trông ok từ quan điểm của tôi.

Câu từ báo cáo vấn đề này cũng cung cấp cho bạn một đầu mối: lý thuyết câu trả lời: về trình tự của sqrt (N).

+0

Cảm ơn bạn. Tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi, vì vậy đôi khi tôi không hiểu tất cả các chi tiết. –

+0

@zubergu: Nitpicking: * if * Tôi không nhầm, [Math.random] (http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#random%28% 29) 'trả về một giá trị kép với một dấu dương, lớn hơn hoặc bằng 0.0 và nhỏ hơn 1.0', hay còn gọi là' [0.0, 1.0) ', do đó phân đoạn mã ban đầu của OP thành' [0.0, 1.0], (1.0, 2.0], (2.0, 3.0], (3.0, 4.0) ' –

+1

@TobiaTesan Chính xác, và bằng cách chuyển từ nhỏ hơn hoặc bằng chỉ nhỏ hơn bạn tạo ra tất cả các phạm vi ngay cả khi có mở ở một đầu và đóng trên một dải khác Tôi đang chỉnh sửa và đưa ra mẫu mã để làm rõ điều này. – zubergu

1

Tôi nghĩ dòng này sẽ không làm việc:

nextStep = Math.random()*4; 

giải thích là một logic. Tôi nghĩ sẽ tốt hơn nếu sử dụng số nguyên cho mục đích của bạn vì bạn muốn tính toán theo các bước, đó là một đơn vị tĩnh. Vâng thats ý kiến ​​dựa, nhưng tôi khuyên bạn nên đếm số lượng đầy đủ các bước thay vì theo dõi các bước một phần.

thử này để thay thế:

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

Hơn nữa kể từ nextInt() tạo ra ngẫu nhiên Integer giá trị bạn cần phải sử dụng == điều hành thay vì <= nhập nếu/else của bạn.

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

liên quan đến Tom (không phải là tôi, là trong các ý kiến!)

+0

Tôi không hiểu lý do của bạn, bạn sẽ xây dựng thêm một chút? –

+0

Lưu ý rằng OP có 'if (nextStep <= 1)' etc –

+0

@TomWellbrock: bây giờ tôi là * nhiều hơn * bối rối. 'Math.random() * (4 - 0);' phải giống hệt nhau (như trong, biên dịch sang cùng một bytecode). Tôi đang thiếu gì? –