簡體   English   中英

滾動 3 個骰子 n 次並計算 C 中的對和三元組概率

[英]Rolling 3 dice n number of times and calculating pair and triplet probability in C

嘗試編寫一個 C 程序,模擬 1000 次擲三個骰子並計算 2 或 3 個數字同時出現在所有 3 個骰子上的概率。 這是我的代碼,我幾天來一直在撓頭,無法弄清楚出了什么問題......理論上它應該可以工作,但打印出來的數字通常約為 3000 對和 -(巨大的數字)對於三胞胎。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i,coppia,tris,d1,d2,d3;
    float probCoppia, probTris;

    printf(" Rolling 3 dice 1000 times...\n");

    for(i=1; i<=1000; i++){
        int d1=rand()%6+1;
        int d2=rand()%6+1;
        int d3=rand()%6+1;

        if(d1==d2 || d1==d3 || d2==d3){
            coppia++;
        }
        else if(d1==d2 && d1==d3){
            tris++;
        }
    }

    probCoppia=coppia*0.1;
    probTris=tris*0.1;
    printf("Pair probability: %f\nTriplet probability: %f",probCoppia,probTris);

}

您必須在循環之前初始化計數器。 否則,您將通過使用不確定的未初始化非靜態局部變量的值來調用未定義的行為

換句話說,線

int i,coppia,tris,d1,d2,d3;

應該

int i,coppia=0,tris=0,d1,d2,d3;

另請注意,當d1==d2 && d1==d3d1==d2 || d1==d3 || d2==d3 d1==d2 || d1==d3 || d2==d3 d1==d2 || d1==d3 || d2==d3永遠為真,所以tris++; 永遠不會被執行。 (正如@pmg 所說)因此,如果您不想將三元組視為對,則應像這樣交換if語句:

if(d1==d2 && d1==d3){
    tris++;
}
else if(d1==d2 || d1==d3 || d2==d3){
    coppia++;
}

如果您想將三胞胎視為對, else像這樣刪除else

if(d1==d2 || d1==d3 || d2==d3){
    coppia++;
}
if(d1==d2 && d1==d3){
    tris++;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM