【问题标题】:How do I get a program that has to loop over 10000 times to run?如何获得一个必须循环超过 10000 次才能运行的程序?
【发布时间】:2020-08-08 07:28:03
【问题描述】:

我正在用 java 编写一个程序,它基本上通过为每一步移动 1 个 x 或 y 值来模拟随机游走。前任。从 (0, 0) 开始,使用 Math.random,我可以使用 x++ 或 y——将 x 或 y 坐标更改一个值。一旦 x 和 y 值加在一起的绝对值给我输入的数字(通过命令行参数),这个 walk 就会终止。有两个命令行整数,第一个是刚才提到的数字,第二个是试验次数,这是我必须模拟这次步行的次数。在该程序结束时,计步器会记录每次试验中采取的步数,然后对其进行平均,以得出每次试验所用的平均步数相加。

我遇到的问题是,当我运行我的程序时,没有出现任何错误或其他任何东西,它只是没有运行,这让我觉得运行时间太长了,而且有太多的迭代需要通过.试验变量的输入将在 100000 到 1000000 之间。如果能提供解决此问题的任何帮助或想法,我将不胜感激。

这是我的程序代码:

public class RandomWalkers {
    
    public static void main(String [] args) {
        
        int r = Integer.parseInt(args[0]);
        double trials = Double.parseDouble(args[1]);
        
        double avgSteps = 0;
        double totalSteps = 0;
        
        int x = 0;
        int y = 0;
        
        int steps;
        
        for(int j = 0; j < trials; j++ ) {
            
            int trialDistance = 0;
        
        for(steps = 0; trialDistance != r; steps++) {
            double random = Math.random();
            
            if(random < 0.25) {
                x++;
            } else if((0.25 < random) && (random < 0.50)) {
                x--;
            } else if((0.50 < random) && (random < 0.75)) {
                y++;
            } else if((0.75 < random) && (random < 1.00)) {
                y--;
            } else {}
            
            totalSteps = totalSteps + steps;
            trialDistance = Math.abs(x) + Math.abs(y);
        
        }

        }
        
        avgSteps = totalSteps / trials;
        System.out.println("average number of steps = " + avgSteps);
    
    }

}

【问题讨论】:

  • 它正在运行,只是可能需要很长时间才能完成。首先尝试运行少量试验,您应该会看到它完成。重复运行以增加试验次数,完成所需的时间会越来越长。
  • 因为随机数出现在正态分布中,所以你的“walker”会长时间保持在(0,0)附近。
  • 它实际上“永远”运行的关键在于您真正模拟了每一步,并且需要大量的步骤。相反,您可以深入研究概率数学并根据预期的概率分布计算结果(免责声明:我不知道您需要的公式)。

标签: java eclipse performance loops for-loop


【解决方案1】:

好的,这里有一个更新的版本。

public class RandomWalkers {

    public static void main(String[] args) {

    int radius = Integer.parseInt(args[0]);
    int trials = Integer.parseInt(args[1]);

    walk(radius, trials);
    }

    public static void walk(int radius, int trials) {
    //not really a radius, but nvm

    int totalSteps = 0;

    for (int t = 0; t < trials; t++) {
        
        //you need to reset the x and y for every trial!
        int x = 0;
        int y = 0;
        int steps = 0;
        
        while (Math.abs(x) + Math.abs(y) != radius) {

        double random = Math.random();

        if (random < 0.25) {
            x++;
        } else if (random < 0.50) {
            x--;
        } else if (random < 0.75) {
            y++;
        } else {
            y--;
        }

        steps++;
        }

        //take this out of the loop or increase only by one!
        totalSteps += steps;

    }

    double avgSteps = totalSteps / (double) trials;
    System.out.println("average number of steps = " + avgSteps);
    }

}

我把所有东西都移到了另一种方法(没有改变任何东西),但是你可以改变什么:

  • 如果随机小于0.25,则删除else if的第一部分,它甚至不会触发else。您也可以将最后一个更改为普通的“else”。
  • 将“totalsteps = totalsteps + steps”从循环中取出 -> 您不想在每一步都添加它。
  • 我想最好将试验作为 int 处理,并且只将其转换为 double 以计算平均值。
  • 您需要在每次试验时更新 x、y 和步骤,否则第二次试验将立即完成第一次试验的结果

它应该足够快,可以进行 100 万次试验或其他什么,只是要小心“半径”,它会显着增加时间

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 2018-08-11
    • 2017-05-24
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多