2014-03-04 52 views
1

所以我们有一部分任务分为两部分。以下是该部分所说的内容。初学者在这里,我有嵌套while循环问题

酒鬼开始漫无目的地从灯柱开始行走。在每一个时间步,酒鬼都会忘记他或她在哪里,并随机一步,无论是北部,东部,南部还是西部,概率为25%。 N级后,酒鬼离开灯柱多远?

编写一个程序RandomWalker.java,它接受一个整数的命令行参数N并模拟一个随机游走步骤的运动。在每个步骤之后,打印随机漫步者的位置,将灯柱 作为原点(0,0)。此外,打印距离原点的最终距离的平方。

该程序正常工作,这是我的代码。

package project2; 

import java.util.*; 
import java.math.*; 

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

     Scanner scan = new Scanner(System.in); 
     Random rand = new Random(); 
     System.out.println("Enter the number of steps you want to take please."); 
     int steps = scan.nextInt(); 
     int x = 0; 
     int y = 0; 
     int XorY; 
     int dist; 
     int count =0; 
     while(count<steps){ 
      XorY = rand.nextInt(2); 
      dist = rand.nextInt(2); 
      if(XorY==0){ 
       if(dist==0) 
        dist = -1; 
       x += dist; 
       System.out.println("("+x+", " +y+")"); 
      } 
      else{ 
       if(dist==0) 
        dist = -1; 
       y += dist; 
       System.out.println("("+x+", " +y+")"); 
      } 
      count ++; 
     } 
     System.out.println("Squared Distance = " + (x*x + y*y)); 
    } 
} 

第二部分是我遇到的问题。它说。

编写一个程序RandomWalkers.java,它带有两个整数命令行参数N和T.在每个T独立实验中,模拟N个步骤的随机游走并计算平方距离。输出 均方距离(T的平均的平方距离。)

%的java RandomWalkers 100万
平方距离= 101.446

%的java RandomWalkers 100万
均方距离= 99.1674

%java RandomWalkers 200 1000
均方距= 195.75

我以为我可以只在外面做一个嵌套的while循环,同时计算内部的试验次数,而与上面完全一样。但它只是回复第一次尝试的距离,而不是所有的平均值。我已经搞了两天,现在看起来如此。任何和所有的帮助表示赞赏。

package project2; 

import java.util.*; 
import java.math.*; 

public class RandomWalkers { 
    public static void main(String args[]) { 
     Scanner scan = new Scanner(System.in); 
     Random rand = new Random(); 
     System.out.println("Enter the number of steps you want to take please."); 
     int steps = scan.nextInt(); 
     System.out.println("Enter the amount of trials you want run please"); 
     int trials = scan.nextInt(); 
     double avgDist =0; 
     int stepCount =0; 
     int trialCount =0; 
     int x = 0; 
     int y = 0; 
     int XorY; 
     int dist; 

     while(trialCount<trials){ 

      while(stepCount<steps){ 
       XorY = rand.nextInt(2); 
       dist = rand.nextInt(2); 
       if(XorY==0){ 
        if(dist==0) 
         dist = -1; 
        x += dist; 
       } 
       else{ 
        if(dist==0) 
         dist = -1; 
        y += dist; 
       } 
       stepCount ++; 


      } 
      avgDist += ((x*x) + (y*y)); 
      trialCount++; 
     } 
     System.out.println("Average Squared Distancee = " +avgDist/(double)trialCount); 
    } 
} 
+0

我会认为'RandomWalkers'会有一个'RandomWalker'数组。你知道,代码重用和名称中的传达?看起来像很多或复制意大利面... –

+1

太糟糕了,你没有写下你的第一个例子作为一种方法。那么第二项任务就太简单了..... – Ingo

回答

2

你应该开始让你的代码更具可读性和可维护性,即使是你自己,通过将问题分成几个单元,这将成为方法。这是你必须做的:

  1. 做T实验。 ECH实验产生的距离
  2. 计算平均距离的

注意的是,第一步骤,其要求提供N和T值的用户,也可以是第一个步骤。但是这甚至不是必需的,因为赋值要求将它们作为命令行参数传递:它们在传递给main()方法的数组中。

如果你写这两个步骤的代码,你最终用下面的代码:

double totalDistance = 0; 
for (int i = 0; i < t; i++) { 
    int distance = makeExperiment(n); 
    totalDistance += distance; 
} 
double averageDistance = totalDistance/t; 

所以,现在你只需要实现makeExperiment()方法。但是这很简单,因为您已经在作业的第一部分中实现了它。你只需要移除无用的代码(向用户询问N的部分,以及显示实验结果的部分),并将其放入返回距离的方法中。

+2

+1我敢打赌,他的教授从来没有提到过方法这个词。可怜的家伙,我希望他不必为这个“教育”付钱。 – Ingo

+2

或者练习的重点正是让学生将问题分解为方法,这是开发人员每天必须完成的工作。我更喜欢这样的练习,而不是那种会说“写出一种方法,然后写出另一种称为第一种方法的方法”的练习。 –