模棱两可的期望值

时间:2017-06-23 08:40:11

标签: c++ algorithm math probability

我在网站上看到了这个问题(我不会使用确切的措辞或提及网站),

  

假设一个孩子在每个月的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

BINGO!正确答案! 但是在考虑更多关于它的事情时,我意识到我选择星期一作为开始的一天,但不可能是任何一天? 所以我在程序中做了一点改变 -

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',因为它是在0001年1月1日星期一,或者问题可能有任何答案,或者我错过了一些非常重要的东西?

对此应该是什么正确答案?
如果没有“正确的”答案,那么您认为哪一个应该是最合适的?

3 个答案:

答案 0 :(得分:3)

您已完成所有必要的思考工作等等;但是你过度概括了。

  

我意识到我选择星期一作为开始的日子,但不管是在任何一天吗?

不,如果在此Universe中设置了问题,则不行。

  

我们应该把它当作4.00666&因为它是在0001年1月1日星期一

&#39; 1月1日&#39;因为当时既不存在公历,也不存在朱利安历法,所以这并不是一个明确指定的年份。

  

或问题可以有任何答案,或者我在这里遗漏了一些非常重要的事情?

     

对此应该是什么样的正确答案?

这个问题只有一个正确的答案,4.001666,因为工作日如何与这个世界中的年份对齐。 1900年1月1日(我们可以在我们喜欢的任何地方开始一个400年的周期,只要它在公历采用后)是星期一,所以更新中的代码 { {1}}来自

main

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

您将立即获得 正确答案。

正如已经确定的那样,工作日与年份对齐的特定方式是推动潜力的变化的原因。答案在这里。同样的事情背后是为什么the 13th of the month is more likely to fall on a Friday than on any other day of the week

答案 1 :(得分:2)

您的扩展结果只能通过400天内未能平均分配的弱日来解释。

这与以7天为基础的周期重复的事实有关,在4个周期(有延期)上重复闰年,而且月份也不长,所以尽管日历在400天后重复,你选择的开始日可能会有一些依赖(显然)。

我们可以更容易地拥有这个:你有400年,每个12个月,我。即3600个月。 3600不能被7分割,因此星期不能在几个月内平均分配,所以你必须根据所选择的开始日获得一些差异......

现在有问题的是最外面的for循环中的这两行:

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

对于某些特定的年,您将开始日期设置为[0..6]中的任意值。然而,这7个值中只有一个实际上与所选年份匹配,其他6个定义了一些幻想日历(你出生的那一天是固定的,找出它们中的任何一个 - 然后想象你将它改变为所有其他日子周...)。

旁注:实际上,您使用格里高利日历(计算基于)从引入时开始向后,这样做,您还必须计算第1年的正确开始日期。不小心它必须(实际上)也是一个星期一,所以你运气得到了正确的结果......

答案 2 :(得分:2)

  

Soooo ......现在真的很困惑......我们应该把它当作4.00666因为它是在0001年1月1日星期一

是的,虽然我们当前的日历系统当时没有使用。如果您选择另一个开始日,那么您将对其他日历系统进行计算,而不是我们实际使用的日历系统。

注意1月1日,1月1日401,801年1月1日,1201年1月1日等等都是一周中的同一天(再次在我们当前的日历系统中)。您不必专门选择第1年,但您必须选择您选择的400年期限的开始。