动态变化的嵌套for循环数

时间:2015-12-29 17:10:49

标签: java

我正在学习Java - 遇到了这个问题:

  

编写一个掷骰子的程序,骰子都是d-sided。通过   使用模拟,报告概率的近似值   使用骰子滚动总共x或更多,其中x,n和d都是   作为输入。例如,如果n = 2,d = 6且x = 7,则为程序   应该报告58.3%概率(大约)。

这就是我想出来的

public class Main {

    public double calcProbability(int n, int d, int x){
        int[] sums = new int[(int)Math.pow(d, n)]; //Creates an array of max size needed
        int counter = 0;    
        int occurrences = 0; //No. of times that the number being added to the array is greater than d
        for(int i=1;i<=d;i++){
            for(int j=1;j<=d;j++){
                if((i+j)>=x){
                    occurrences++;
                }
                sums[counter]=(i+j);
                counter++;
            }
        }
        return (double)occurrences/Math.pow(d, n); //Returning probability
    }

    public static void main(String[] args) {
        System.out.println(new Main().calcProbability(2, 6, 7));
    }

}

它适用于n = 2(我认为),因为我使用两个嵌套for循环。但我无法弄清楚如何用n改变for循环的数量(这将允许我将所有可能的总数添加到数组中 - 其余代码应该可以正常工作)。

非常感谢一些指导。

在考虑到每个人的贡献之后,感谢大家,这是修改后的方法:

public double calcProbability(int n, int d, int x){
        Random random = new Random(); //Random numbers simulate dice rolling
        int occurrences = 0; //No. of times that the number is greater than d
        for(int i=0;i<100000;i++)
        {
            int sum = 0;
            for(int j=0;j<n;j++)
            {
                sum+=random.nextInt(d)+1;
            }
            if(sum>=x) {
                occurrences++;
            }

        }
            return (double)occurrences/100000; //Will be an approximation
    }

存储这些数字然后计算出现次数是毫无意义的 - 而只是计算出现的次数并继续前进。

3 个答案:

答案 0 :(得分:4)

出于动态循环的目的,答案如下。但是,跳到第二段以获得更好的推荐方法。获取动态循环的方法是使用递归。如果你愿意,我可以详细说明,但是在高层次上,你所拥有的是一个指定第n个骰子和减量的参数,当它到达第0个骰子时,递归结束。您必须对变量进行相当多的更改,并将它们移动到参数或全局变量中,以便您可以使用该函数继续更新它们。

对于这个问题,我会采用完全不同的方法。创建一个名为Roll的函数,它接受两个参数:骰子值的范围和要掷骰子的数量。我将保留函数的细节给你,但它涉及生成随机数一定次数。由于问题需要模拟,因此请多次调用此Roll函数,然后使用数组来跟踪出现的答案。在这一点上,进行除法和百分比以获得良好的近似值。

答案 1 :(得分:1)

也许你应该在一个循环中迭代骰子滚动的可能结果。

结果是一个大小为n的整数数组,其值全部在 [1,d] 中。

您的代码将是:

int occurrences = 0;
int count = 0;
Result result = new Result(n, 1); // n times 1.
while(result != null)
{
    if (result.Sum >= x) occurrences++;
    count++;

    GetNextResult(result);
}

double probability = occurrences / (double) count;

GetNextResult返回下一个可能的结果,如果输入为null,则返回[d, d, ..., d]

当然,您必须正确编写Result类代码。

答案 2 :(得分:1)

在考虑到每个人的贡献之后,感谢大家,以下是修改后的方法:

public double calcProbability(int n, int d, int x){
        Random random = new Random(); //Random numbers simulate dice rolling
        int occurrences = 0; //No. of times that the number is greater than d
        for(int i=0;i<100000;i++)
        {
            int sum = 0;
            for(int j=0;j<n;j++)
            {
                sum+=random.nextInt(d)+1;
            }
            if(sum>=x) {
                occurrences++;
            }

        }
            return (double)occurrences/100000; //Will be an approximation
    }

存储这些数字然后计算出现次数毫无意义 - 而只是计算发生时的发生次数并继续进行