2017-06-23 140 views
4

我看到網站上的這個問題(我不會使用的確切措辭或提到的網站),曖昧期望值

假設一個孩子得到他的口袋裏的錢在每月的15日,根據該 那天是它在那天,讓我們說他得到1個硬幣在星期一 ,星期二有2個硬幣...星期天有7個硬幣。他在隨機月份的第15個月將獲得的預期 硬幣數量是多少?

起初我雖然每個的概率是1/7,所以答案應該是4,但它說的是錯誤的答案。

然後想詳細瞭解一下如何選擇一個隨機一個月,記住,日曆每400年後重演,所以想也許它是與這一點,所以我寫了下面的代碼:

int Date(int mn,int yr) 
{ 
    if((yr%400==0 || (yr%100!=0 && yr%4==0)) && mn==2) 
     return 29; 
    if(mn==2) 
     return 28; 
    if(mn==4 || mn==6 || mn==9 || mn==11) 
     return 30; 
    return 31; 

} 

int main() 
{ 
    double coins=0; 
    int wk=0; 

    for(int yr=1;yr<=400;yr++) 
    { 
     for(int mn=1;mn<=12;mn++) 
     { 
      for(int dt=1;dt<=Date(mn,yr);dt++) 
      { 
       if(dt==15) 
        coins += wk%7 +1; 
       wk++; 
      } 
     } 
    } 

    cout<<setprecision(10)<<coins/12/400; 
} 

輸出 -

4.001666667 

和賓果!正確答案! 但是在思考更多一點的時候,我意識到我選擇星期一作爲開始的一天,但是不可能有一天嗎? 所以我在做這個節目變化不大 -

int main() 
{ 
    double total=0; 

    for(int i=0;i<7;i++) 
    { 
     int wk=i; 
     double coins=0; 
     for(int yr=1;yr<=400;yr++) 
     { 
      for(int mn=1;mn<=12;mn++) 
      { 
       for(int dt=1;dt<=Date(mn,yr);dt++) 
       { 
        if(dt==15) 
         coins += wk%7 +1; 
        wk++; 
       } 
      } 
     } 
     cout<<setprecision(10)<<coins/12/400<<endl; 
     total += coins; 
    } 

    cout<<endl<<setprecision(10)<<total/7/12/400; 
} 

輸出 -

4.001666667 
3.998333333 
4.000833333 
3.998958333 
4 
4.001041667 
3.999166667 

4 

SOOOO ......現在真的很迷茫......我們就應該把它4.00666「導致它在1日是星期一Jan 0001或者問題可以有任何答案,或者我在這裏錯過了一些非常重要的東西?

這應該是正確的答案?
如果沒有「正確」答案存在,那麼您認爲最合適的答案是什麼?

+0

隨機月份是什麼?今年?任何年份(一致的概率)在給定的時間間隔內,還是永恆的?也許你沒有引用相關的部分,也許整個練習沒有明確說明,也無法解決。 –

+0

@ArneVogel這個問題只是說「隨機月」,它沒有描述任何關於隨機月份被選擇的地方,我想它只能被視爲永恆。 –

回答

3

你已經完成了所有必要的思想工作,但是你已經過度概括了。

我意識到我選擇星期一作爲開始的一天,但不可能是任何一天?

不,如果問題是在這個宇宙中設置的話。

,我們應該只是把它4.00666「的原因是星期一在1月1日0001

‘1月1日1’是不是真的一個良好的特定的一年,因爲無論是陽曆甚至也不是朱利安日曆存在。

或者問題可以有任何答案或我錯過了一些非常重要的東西嗎?

這應該是正確的答案?

問題已經因爲平日如何排隊,在這個宇宙多年只有一個正確答案,4.001666。 1900年1月1日(我們可以開始一個400年的週期的任何地方,我們喜歡,只要它是採用公曆後)是週一,所以從

for(int yr=1;yr<=400;yr++) 

更新您的第一main代碼

for(int yr=1900; yr < 1900+400; yr++) 

,你會馬上得到正確答案。


由於已經確定,其中平日排隊與年的具體做法是什麼驅動的「勢」答案在這裏的變化。同樣的事情是爲什麼the 13th of the month is more likely to fall on a Friday than on any other day of the week

+0

你說我們可以選擇任何開始日期,只要它是在公曆通過之後,那麼這意味着日期也可以從其他日子而不是星期一開始,答案會不同 –

+2

我們可以選擇任意日期,但是必須將'wk'的初始值設置爲當天的正確值!我選擇了1900年1月1日,因爲它是一個星期一,這意味着其他代碼不得不改變。如果我選擇1900年1月2日,'int wk = 0;'必須改爲'int wk = 1;'...... – AakashM

+0

啊......是的!謝謝AakashM ...應該已經想到了我自己!我的大邏輯錯誤... –

2

您的擴展結果只能解釋爲在400年內不能平均分配的疲軟日子。

這與一個以7爲基礎的週期重複7週週期的事實有關,閏年在基於4的週期上重複(有擴展),並且月也不是同樣長,所以雖然日曆在400天后重複,可能很可能會對您選擇的開始日有所依賴(顯然)。但是,我們可以更容易地做到這一點:你有400年,每個月有12個月,即3600個月。 3600是不是7整除,所以工作日無法被均勻地分佈在幾個月,所以你必須得到一定的差異取決於所選擇的開始日期...

有問題現在內的這兩條線最外層的for循環:

int wk=i; 
for(int yr=1;yr<=400;yr++) 

您設置的開始日期爲任意值超出[0..6]對於一些特定年。然而,這7個值中只有一個與選定年份匹配,其他6個值定義了一些幻想日曆(您的出生日期已修復,找出它們是哪一個),然後想象您將其改變爲所有其他日期周...)。附註:實際上,您使用公曆日曆(計算是基於)從引入日期開始倒退,這樣做,您也必須計算第1年的正確開始日期。通過事故必須有(幾乎)是一個星期一,也讓你有靠運氣了正確的結果......

+0

是的,這確實是我的代碼的問題,我沒有意識到,即使考慮了幾個小時後! (也許我太過於自信了,我的回答是正確的,或者太愚蠢而忽略了這個重要的事實)。現在只有我覺得我的論點很愚蠢!感謝您的幫助:) –

2

SOOOO ......現在真的很迷茫......我們應該只是把它4.00666「因爲它是星期一在1月1日0001

是的,雖然我們當前的日曆系統當時沒有被使用。如果您選擇另一個開始日期,那麼您將對其他日曆系統進行計算,而不是實際使用的日曆系統。

請注意,1月11日,1月1日401,1月1日801,1月1日1201等都是一週中的同一天(同樣在我們當前的日曆系統中)。您無需專門選擇第1年,但必須選擇您選擇的任意400年期間的開始時間。