程序使用循环和随机生成器(从java开始)

时间:2013-11-06 18:33:34

标签: java loops random

街道网格中的醉汉随机选择四个方向中的一个并绊倒到下一个交叉路口,然后再次随机选择四个方向中的一个,依此类推。你可能会认为平均而言醉酒者并没有走得太远,因为选择相互抵消了,但情况并非如此。将位置表示为整数对(x,y)。实施醉汉的步行100多个交叉点,从(0,0)开始并打印结束位置

有人可以帮忙吗?我完全迷失了在同一程序中使用随机生成器和循环

以下是我所拥有的。它符合要求,但不打印任何东西,我不确定我是否正确地得到随机的100交叉点

import java.util.*;

class Drunkard {
    int x, y; 
    Drunkard(int x, int y) {
    this.x = x; 
    this.y = y;
    } 
    void moveNorth() {
    this.y -= 1; 
    }
    void moveEast() {
    this.x += 1; 
    }
    void report() {
    System.out.println("Hiccup: " + x + ", " + y); 
    } 
} 

class Four {
    public static void main(String[] args) {
    Random generator = new Random(); 
    Drunkard drunkard = new Drunkard(100, 100); 
    int direction; 
    for (int i = 0; i < 100; i++) {
        direction = Math.abs(generator.nextInt()) % 4; 
        if        (direction == 0) { // N
        drunkard.moveNorth();
        } else if (direction == 1) { // E
        drunkard.moveEast(); 
        } else if (direction == 2) { // S
        System.out.println("Should move South."); 
        } else if (direction == 3) { // W
        System.out.println("Should move West."); 
        } else {
        System.out.println("Impossible!"); 
        } 
        System.out.drunkard.report(); 
    } 
    }
} 

6 个答案:

答案 0 :(得分:1)

您的计划将是:

  

初​​始化

     

循环:1到100,执行:

i = random()

if i<=0.25 : go north

if i>0.25 and i<=0.5 : go south 

if i>0.5 and i<= 0.75 : go east

if i>0.75 and i<= 1 : go west
     

结束循环

     

显示最后一点。

答案 1 :(得分:1)

我看到了各种各样的问题:

  • 您正在将醉汉的位置初始化为100,100。该任务表示初始化为0,0。
  • System.out.drunkard.report()绝对不会编译。只需致电drunkard.report()
  • 说明打印最终位置,因此您需要将调用drunkard.report()向下移动一行,以使其位于for循环之外。
  • 您还没有为moveSouth或moveWest编写方法。写下它们并在适当的位置添加对它们的调用。
  • 第四类需要公开才能直接运行。
  • 优秀的Java编程实践表明,每个类都应该在自己的文件中,但这可能与教师要求你做的事情背道而驰。

但是,我不认为这是你的问题。我认为您尝试运行该程序的方式/位置存在问题。你说它编译得很好,但不打印任何输出。你知道在编译之后还有另一个步骤来运行程序,对吗?

要清楚,这就是你应该做的事情。在命令行中,确保您位于.java文件所在的目录中。我将假设它被称为Four.java。输入以下内容,在每行之后按Enter键。 (不要输入$提示符)

$ javac *.java
$ java Four

我复制了您在上面发布的代码,修复了我突出显示的问题,并按照上面的说明操作;它完美无缺。

答案 2 :(得分:0)

您可以使用

int direction = (new Random()).nextInt(4);

并使用此方向变量来确定他走到哪里。我会在这种情况下使用递归而不是循环。

答案 3 :(得分:0)

这从0,0开始。生成随机数以确定位置并更新位置。

  • 不确定您生成随机数的方式,这似乎对我有用。

    Point currentLocation = new Point();
    currentLocation.setLocation(0, 0);
    
    Point newLocation = new Point(0,0);
    
    Random random = new Random();
    
    //make 100 moves
    for(int i=0; i<100; i++)
    {
        int k = random.nextInt(4);
        if(k == 0)
        {
            //use your drunkard method here
            newLocation.setLocation(currentLocation.getX(), currentLocation.getY() + 5); 
        }
        else if (k == 1)
        {
            //go south
            newLocation.setLocation(currentLocation.getX(), currentLocation.getY() - 5);
        }
        else if (k == 2)
        {
            //go east
            newLocation.setLocation(currentLocation.getX() + 5, currentLocation.getY());
        }
        else if(k == 3)
        {
            //go west
            newLocation.setLocation(currentLocation.getX() - 5, currentLocation.getY()); 
        }
        currentLocation.setLocation(newLocation);
    }
    
    System.out.println(currentLocation);
    

    }

答案 4 :(得分:0)

你没有完全实现你的随机生成器。

Random generator = new Random();
int    direction = generator.nextInt(4); // This will return a random int 
                                         // between 0 and 3

使用Random()时的一些其他有用技巧如下:

int i = generator.nextInt(4)+2; // This will return a random int 
                                // between 2 and 5

如果您真的想学习使用随机类可以做的所有巧妙技巧,我强烈建议您查看this

答案 5 :(得分:0)

我所做的就是创建一个循环,生成一个介于-1和1之间的随机数,并将这些值加总100次。为x和y做那个。

    int x = 0;
    int y = 0;

    //intial = (0,0)
    //North = (0, 1)
    //South = (0, -1)
    //East = (1, 0)
    //West = (-1, 0)

    for(int i = 0; i < 100; i++)
    {
        x += (int) (Math.random() * 3) + (-1);
        y += (int) (Math.random() * 3) + (-1);
    }
    System.out.printf("The Drunkard is now located at: (%d, %d)", x, y);