我學習Java的動態變化數 - 碰到這樣的問題:嵌套的for循環
編寫滾動骰子ň,其中骰子都是d片面的程序。通過 使用模擬,使用骰子報告概率爲 的總概率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
}
這是毫無意義的保存這些數字,然後計算髮生的次數 - 而僅計算髮生時,它需要放置並繼續前進。
您可以在沒有模擬的情況下計算確切的更改。 –
添加到@PeterLawrey:你**不能**用模擬計算概率。你必須拿出一個公式,並解決給定輸入的公式 – luk2302
即使對於給定的輸入,我也不確定這是否會回答問題。你不是「滾動骰子」,因爲我知道你應該使用隨機數字發生器。這個想法不是要計算概率值(可以用手來完成),而是模擬擲骰子並驗證它是否收斂到某個值。 –