2017-04-06 40 views
0

該程序應該運行仿真,以查看用戶輸入的數字是否少於三個隨機生成的數字。所有數字的範圍從0到1.用戶指定模擬運行的試驗次數,然後程序告訴用戶所有三個數字都小於它們的次數以及它不是的次數。問題在於,每次運行程序時,無論應該運行多少次試驗,我總會得到1次或1次失敗。我認爲這是因爲我只生成一組隨機數,而不是指定很多,但我不知道如何解決這個問題。在循環中生成多個隨機數C

這裏是代碼 -

int main() 
{ 
int seed, trials, pass1, fail1, i, j, k; 
float reli; 

printf("Enter individual component reliability:\n"); 
scanf("%f", &reli); 

printf("Enter number of trials:\n"); 
scanf("%u", &trials); 



srand(time(NULL)); 
float rndm1 = (double)rand()/(double)RAND_MAX; 
float rndm2 = (double)rand()/(double)RAND_MAX; 
float rndm3 = (double)rand()/(double)RAND_MAX; 

while(k <= trials); { 
    pass1 = 0; 
    fail1 = 0; 
    if (rndm1 <= reli && rndm2 <= reli && rndm3 <= reli){ 
     pass1 = pass1 + 1; 
    } 
    else { 
    fail1 = fail1 + 1; 
} 

k++; 
} 
printf("# of passes = %d, #of failures = %d", pass1, fail1); 
} 

感謝

+0

'之前的scanf( 「%U」 型,與試驗);' - >'的scanf( 「%d」 ,&trials);' –

+0

當你定義一個本地非靜態變量(例如你的變量'k')時,它不會被自動初始化。它將具有*不確定*值。在沒有初始化的情況下使用它可能導致*未定義的行爲*。 –

+0

您需要將rndm1,rndm2,rnd3和調用移至while循環內的rand()。你需要爲每個試驗產生新的隨機數(我猜這是)。 –

回答

2

4事情,我覺得有問題:

由於阿賈伊說: 你剛纔生成1組數字,似乎你想要每次都得到不同的設置。所以你應該把它移到循環中。

然後,您每次通過循環時都重置您的通過和失敗值。所以它每次都以0開頭。您可能希望將該聲明移出循環。

第三件事是你沒有循環。 while(k <= trials);意味着沒有什麼可做的事情。因爲循環的結尾位於;。你必須刪除它。

然後,當StoryTeller提到你必須在使用它們之前初始化變量。這是你沒碰到一個無限循環只是純粹的運氣這麼做k=0;您使用k

int main() 
{ 
int seed, trials, pass1, fail1, i, j, k; 
float reli; 
float rndm1; 
float rndm2; 
float rndm3; 

printf("Enter individual component reliability:\n"); 
scanf("%f", &reli); 

printf("Enter number of trials:\n"); 
scanf("%u", &trials); 



srand(time(NULL)); 
pass1 = 0; 
fail1 = 0; 
k = 0; 

while(k < trials) 
{ 
    rndm1 = (float)rand()/RAND_MAX; //one cast is enough but casting both is not wrong and if you use float cast to float 
    rndm2 = (float)rand()/RAND_MAX; 
    rndm3 = (float)rand()/RAND_MAX; 

    if (rndm1 <= reli && rndm2 <= reli && rndm3 <= reli) 
    { 
     pass1 = pass1 + 1; 
    } 
    else 
    { 
     fail1 = fail1 + 1; 
    } 
    k++; 
} 
printf("# of passes = %d, #of failures = %d", pass1, fail1); 
}