java - Java 应用程序拒绝将输出显示为浮点数。试过铸造,乘1.0,加0.0,没有用
问题描述
问题:
我在计算整数除法并显示为双精度(浮点)时遇到问题。
在较低的数字上,它显示为浮点数,但似乎将值四舍五入为 11.0、9.0、28.0。在尝试通过其他 StackO 帖子解决问题后,我似乎无法使其保持一致。我已经通过一些解决方案能够将其显示为浮点解决方案,但是通过测试命令运行,结果在它们是否显示为浮点时不一致。
作业要求:
编写一个程序 RandomWalkers.java,它接受两个整数命令行参数“r”和“trials”。在每个试验独立实验中,模拟随机游走,直到随机游走者与起点的曼哈顿距离为 r。打印平均步数。
随着 'r' 的增加,我们预计随机游走者会采取越来越多的步骤。但是还有多少步骤?使用 RandomWalkers.java 制定关于平均步数如何作为“r”函数增长的假设。
通过生成随机样本和聚合结果来估计未知量是蒙特卡罗模拟的一个例子——一种强大的计算技术,广泛用于统计物理学、计算金融和计算机图形学。
您不能调用除 java.lang 中的库函数(例如Integer.parseInt()
和Math.sqrt()
)之外的库函数。仅使用课程中已经介绍过的 Java 特性(例如,循环和条件,但不使用数组)。
我试过的:
阅读至少 30 多个不同的 StackOverflow 和其他各种网站页面,将整数除法显示为浮点(双)等,并尝试了其中的所有内容。
avgSteps = (double) totalNumSteps / trials;
将部分/所有变量更改为 Double
(totalNumSteps * 1.0) / trials;
(totalNumSteps + 0.0) / trials;
有时我有一个突破,但后来我对它进行了更多测试,它失败了,部分或全部参数传递给了应用程序。
代码:
下面的代码是代码的清理后的基本版本,减去上面的任何测试。
public class RandomWalkers {
public static void main(String[] args) {
int r = Integer.parseInt(args[0]);
int trials = Integer.parseInt(args[1]);
int x = 0;
int xx = 0;
int y = 0;
int yy = 0;
int numSteps = 0;
int totalNumSteps = 0;
double randNum = 0.0;
double avgSteps = 0.0;
for (long i = 0; i < trials; i++) {
while (Math.abs(x - xx) + Math.abs(y - yy) != r) {
randNum = Math.random();
if (randNum <= .25) {
// North
yy++;
} else if (randNum <= .5) {
// East
xx++;
} else if (randNum <= .75) {
// South
yy--;
} else {
// West
xx--;
}
numSteps++;
}
totalNumSteps += numSteps;
}
avgSteps = totalNumSteps / trials;
System.out.println("average number of steps = " + avgSteps);
}
}
预期结果:
这是家庭作业项目部分中提供的请求参数和预期输出。
~/Desktop/loops> java RandomWalkers 5 1000000
平均步数 = 14.98188
~/Desktop/loops> java RandomWalkers 5 1000000
平均步数 = 14.93918
~/Desktop/loops> java RandomWalkers 10 100000
平均步数 = 59.37386
~/Desktop/loops> java RandomWalkers 20 100000
平均步数 = 235.6288
~/Desktop/loops> java RandomWalkers 40 100000
平均步数 = 949.14712
~/Desktop/loops> java RandomWalkers 80 100000
平均步数 = 3775.7152
~/Desktop/loops> java RandomWalkers 160 100000
平均步数 = 15113.61108
评分工作(实际结果)
测试 RandomWalkers 的正确性
总共运行 7 次测试。
测试一:检查输出格式
% java RandomWalkers 5 10000
平均步数 = 9.0
% java RandomWalkers 10 1000
平均步数 = 18.0
% java RandomWalkers 20 123456
平均步数 = 150.0
% java RandomWalkers 40 1
平均步数 = 726.0
% java RandomWalkers 1 10000
平均步数 = 1.0
% java RandomWalkers 0 333
平均步数 = 0.0
==> 通过
测试 2:检查平均步数(试验 = 10000)* java RandomWalkers 1 10000
* java RandomWalkers 2 10000
- 学生平均步数 = 2.000000 - 真实平均步数 = 2.6666666666666665 - 99.99% 置信区间 = [2.617080, 2.716254]
- 正确的解决方案将因运气不佳而导致此测试失败大约 1以 10,000 为单位的时间
java RandomWalkers 3 10000
- 学生平均步数 = 3.000000
- 真正的平均步数 = 5.5709
- 99.99% 置信区间 =
[5.443408, 5.698392]
- 一个正确的解决方案将在 10,000 次中大约 1 次因运气不佳而未能通过此测试
java RandomWalkers 4 10000
- 学生平均步数 = 24.000000
- 真正的平均步数 = 9.6808
- 99.99% 置信区间 =
[9.444787, 9.916813]
- 一个正确的解决方案将在 10,000 次中大约 1 次因运气不佳而未能通过此测试
java RandomWalkers 5 10000
- 学生平均步数 = 7.000000
- 真正的平均步数 = 14.9775
- 99.99% 置信区间 =
[14.602377, 15.352623]
- 一个正确的解决方案将在 10,000 次中大约 1 次因运气不佳而未能通过此测试
java RandomWalkers 10 10000
- 学生平均步数 = 52.000000
- 真正的平均步数 = 59.1465
- 99.99% 置信区间 =
[57.612929, 60.680071]
- 一个正确的解决方案将在 10,000 次中大约 1 次因运气不佳而未能通过此测试
java RandomWalkers 20 10000
- 学生平均步数 = 390.000000
- 真正的平均步数 = 235.9058
- 99.99% 置信区间 =
[229.737686, 242.073914]
- 一个正确的解决方案将在 10,000 次中大约 1 次因运气不佳而未能通过此测试
java RandomWalkers 40 10000
- 学生平均步数 = 2056.000000
- 真正的平均步数 = 943.3142
- 99.99% 置信区间 =
[918.599036, 968.029364]
- 一个正确的解决方案将在 10,000 次中大约 1 次因运气不佳而未能通过此测试
==>失败
测试 3:检查平均步数(半径 = 5)* java RandomWalkers 5 100
- 学生平均步数 = 11.000000 - 真实平均步数 = 14.9775 - 99.99% 置信区间 = [11.226273, 18.728727]
- 一个正确的解决方案将因运气不佳而使该测试失败大约 1 次在 10,000
java RandomWalkers 5 1000
- 学生平均步数 = 7.000000
- 真正的平均步数 = 14.9775
- 99.99% 置信区间 =
[13.791258, 16.163742]
- 一个正确的解决方案将在 10,000 次中大约 1 次因运气不佳而未能通过此测试
java RandomWalkers 5 10000
- 学生平均步数 = 5.000000
- 真正的平均步数 = 14.9775
- 99.99% 置信区间 =
[14.602377, 15.352623]
- 一个正确的解决方案将在 10,000 次中大约 1 次因运气不佳而未能通过此测试
java RandomWalkers 5 100000
- 学生平均步数 = 9.000000
- 真正的平均步数 = 14.9775
- 99.99% 置信区间 =
[14.858876, 15.096124]
- 一个正确的解决方案将在 10,000 次中大约 1 次因运气不佳而未能通过此测试
java RandomWalkers 5 1000000
- 学生平均步数 = 21.000000
- 真正的平均步数 = 14.9775
- 99.99% 置信区间 =
[14.939988, 15.015012]
- 一个正确的解决方案将在 10,000 次中大约 1 次因运气不佳而未能通过此测试
==>失败
测试 4:检查平均步数(半径 = 0)* java RandomWalkers 0 1000
* java RandomWalkers 0 100
* java RandomWalkers 0 1
==> 通过
测试 5:检查平均步数是否不是整数 * java RandomWalkers 10 1000
- 学生平均步数 = 70.0 - 正确的解决方案将在 10,000 次测试中失败少于 1 次
java RandomWalkers 7 2500
- 学生平均步数 = 51.0
- 正确的解决方案将在 10,000 次测试中失败少于 1 次
java RandomWalkers 3 10000
- 学生平均步数 = 5.0
- 正确的解决方案将在 10,000 次测试中失败少于 1 次
==>失败
测试 6:检查程序每次产生不同的结果 * java RandomWalkers 10 10000
[ repeated twice ]
* java RandomWalkers 20 1000
[ repeated twice ]
* java RandomWalkers 40 2000
[ repeated twice ]
==> 通过
测试 7:当试验 = 1 * java RandomWalkers 2 1
[ repeated 1024 times ]
* java RandomWalkers 3 1
[ repeated 8192 times ]
* java RandomWalkers 4 1
[ repeated 65536 times ]
* java RandomWalkers 5 1
[ repeated 1048576 times ]
==> 通过时检查平均步数的随机性
RandomWalkers 总计:4/7 测试通过!
解决方案
所以这里有两个问题。1) 正如 Carlos Heuberger 所指出的,每次循环时都需要重新初始化变量。2)正如您所指出的,将除法设置为实数除法,而不是整数的“div”运算符需要一些注意。我对您的代码进行了这两项更改(for 循环中的前 5 行;(1.0 * 试验)),它似乎通过了所有测试。你很亲密。
public class RandomWalkers {
public static void main(String[] args) {
int r = Integer.parseInt(args[0]);
int trials = Integer.parseInt(args[1]);
int x = 0;
int xx = 0;
int y = 0;
int yy = 0;
int numSteps = 0;
int totalNumSteps = 0;
double randNum = 0.0;
double avgSteps = 0.0;
for (long i = 0; i < trials; i++) {
x = 0;
xx = 0;
y = 0;
yy = 0;
numSteps = 0;
while (Math.abs(x - xx) + Math.abs(y - yy) != r) {
randNum = Math.random();
if (randNum <= .25) {
// North
yy++;
} else if (randNum <= .5) {
// East
xx++;
} else if (randNum <= .75) {
// South
yy--;
} else {
// West
xx--;
}
numSteps++;
}
totalNumSteps += numSteps;
}
avgSteps = totalNumSteps / (1.0 * trials);
System.out.println("average number of steps = " + avgSteps);
}
}
推荐阅读
- visual-studio-code - 在 VSCode 主题中自定义块引用颜色
- emacs - emacs ocaml 自动关闭注释
- javascript - 确保结果以相反的方式显示(Javascript)
- laravel-5.7 - Laravel-5.7 不创建文件夹 resources\views\layouts
- specman - 如何逐个运行e文件?不平行测试
- android - 使用sceneform arcore android向3d模型添加文本
- c# - 如何以编程方式将 SetCurve 键设置为时间轴 CustomClip?
- javascript - 从前端上传后如何将文件写入磁盘?
- kubernetes - Kubernetes 子网和 docker 子网
- python - if 条件下 str.isdigit() 的问题