首页 > 解决方案 > 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 特性(例如,循环和条件,但不使用数组)。

我试过的:

有时我有一个突破,但后来我对它进行了更多测试,它失败了,部分或全部参数传递给了应用程序。

代码:

下面的代码是代码的清理后的基本版本,减去上面的任何测试。

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 为单位的时间

==>失败

测试 3:检查平均步数(半径 = 5)* java RandomWalkers 5 100 - 学生平均步数 = 11.000000 - 真实平均步数 = 14.9775 - 99.99% 置信区间 = [11.226273, 18.728727] - 一个正确的解决方案将因运气不佳而使该测试失败大约 1 次在 10,000

==>失败

测试 4:检查平均步数(半径 = 0)* java RandomWalkers 0 1000 * java RandomWalkers 0 100 * java RandomWalkers 0 1 ==> 通过

测试 5:检查平均步数是否不是整数 * java RandomWalkers 10 1000 - 学生平均步数 = 70.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 测试通过!

标签: javafloating-pointinteger-division

解决方案


所以这里有两个问题。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);


   }

}

推荐阅读