街道网格中的醉汉随机选择四个方向中的一个并绊倒到下一个交叉路口,然后再次随机选择四个方向中的一个,依此类推。你可能会认为平均而言醉酒者并没有走得太远,因为选择相互抵消了,但情况并非如此。将位置表示为整数对(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();
}
}
}
答案 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)
我看到了各种各样的问题:
System.out.drunkard.report()
绝对不会编译。只需致电drunkard.report()
。但是,我不认为这是你的问题。我认为您尝试运行该程序的方式/位置存在问题。你说它编译得很好,但不打印任何输出。你知道在编译之后还有另一个步骤来运行程序,对吗?
要清楚,这就是你应该做的事情。在命令行中,确保您位于.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);