我正在学习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
}
存储这些数字然后计算出现次数是毫无意义的 - 而只是计算出现的次数并继续前进。
答案 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
}
存储这些数字然后计算出现次数毫无意义 - 而只是计算发生时的发生次数并继续进行