1

街道网格中的醉汉随机选择四个方向之一并跌跌撞撞地走到下一个十字路口,然后再次随机选择四个方向之一,依此类推。你可能会认为酒鬼平均不会移动很远,因为选择相互抵消,但事实并非如此。将位置表示为整数对 (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(); 
    } 
    }
} 
4

6 回答 6

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

结束循环

显示最后一点。

于 2013-11-06T18:38:53.303 回答
1

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

  • 您将 Drunkard 的仓位初始化为 100,100。该分配说初始化为0,0。
  • System.out.drunkard.report()绝对不编译。只要打电话drunkard.report()
  • 说明说要打印最终位置,因此您需要将drinkard.report() 的调用移至下一行,使其位于for 循环之外。
  • 您还没有为 moveSouth 或 moveWest 编写方法。编写它们并在适当的位置添加对它们的调用。
  • 第四类需要公开才能直接运行。
  • 良好的 Java 编程实践说每个类都应该在自己的文件中,但这可能与您的讲师要求您做的相反。

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

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

$ javac *.java
$ java Four

我复制了您在上面发布的代码,修复了我突出显示的问题,并按照我自己的上述说明进行操作;它完美地工作。

于 2013-11-06T19:03:25.660 回答
0

您可以使用

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

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

于 2013-11-06T18:37:33.443 回答
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);
    

    }

于 2013-11-06T19:08:14.407 回答
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

如果您真的想学习使用 Random 类可以完成的所有巧妙技巧,我强烈建议您查看此内容。

于 2013-11-06T19:11:47.783 回答
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);
于 2017-03-13T20:00:48.353 回答