模棱两可的期望值

Posted

技术标签:

【中文标题】模棱两可的期望值【英文标题】:Ambiguous Expectation value 【发布时间】:2017-06-23 08:40:11 【问题描述】:

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

假设一个孩子在每个月的 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,因为它是 0001 年 1 月 1 日星期一,或者问题可能有任何答案,或者我在这里遗漏了一些非常重要的东西?

这个问题的正确答案应该是什么? 如果不存在“正确”答案,那么您认为最合适的答案应该是什么?

【问题讨论】:

随机月份是什么?今年?给定间隔内的任何年份(统一概率),还是永恒?也许你没有引用相关的部分,也许整个练习没有明确说明并且无法解决。 @ArneVogel 这个问题只是说“随机月份”,它没有描述随机月份是从哪里选择的,我想它只能被视为永恒。 【参考方案1】:

您已经完成了所有必要的思考工作等等;但你过于笼统了。

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

不,如果问题是在这个宇宙中设置的,则不会。

我们应该把它取为 4.00666,因为它是 0001 年 1 月 1 日星期一

'1st Jan 1' 并不是一个明确的年份,因为当时既没有公历,也没有儒略历。

或者这个问题可以有任何答案,还是我在这里遗漏了一些非常重要的东西?

这个问题的正确答案应该是什么?

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

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

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的背后也是同样的事情。

【讨论】:

你说我们可以选择任何开始日期,只要它是在公历采用之后,那么这意味着日期也可以从其他一天而不是星期一开始,答案会有所不同 我们可以选择任何日期,但是您必须将wk 的初始值设置为该日期的正确值!我选择了 1900 年 1 月 1 日,因为它是星期一,这意味着无需更改其他代码。如果我选择了 1900 年 1 月 2 日,int wk=0; 将不得不更改为 int wk=1; ... 啊……当然是的!谢谢AakashM ...我自己应该想到的!我的逻辑上的大错误......【参考方案2】:

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

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

请注意,1 月 1 日、1 月 1 日 401 日、1 月 1 日 801 日、1201 年 1 月 1 日等都是一周中的同一天(同样在我们当前的日历系统中)。您不必特别选择第 1 年,但您必须选择您选择的任何 400 年期间的开始。

【讨论】:

【参考方案3】:

您的扩展结果只能用 400 年期间的几个月中没有平均分布的弱日来解释。

这与以下事实有关:工作日以 7 为基础的周期重复,而闰年以 4 为基础的周期重复(有扩展),并且月份也不相同,因此尽管日历在 400 天后重复,很可能对您选择的开始日期有一定的依赖性(显然)。

不过,我们可以更轻松地做到这一点:您有 400 年,每 12 个月,即。 e. 3600个月。 3600 不能被 7 整除,因此工作日不能平均分布在几个月内,所以您必须根据所选的开始日期有所不同... p>

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

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

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

旁注:实际上,您从引入公历日历(计算依据)开始向后使用,这样做,您还必须计算第 1 年的正确开始日期。碰巧它也一定(实际上)是星期一,所以你很幸运地得到了正确的结果......

【讨论】:

是的,这确实是我的代码的问题,即使考虑了几个小时,我也没有意识到这一点! (也许我太自信了,我的答案是正确的,或者太愚蠢而无法忽视这个重要的事实)。直到现在我才觉得我的论点是多么愚蠢!无论如何感谢您的帮助:)

以上是关于模棱两可的期望值的主要内容,如果未能解决你的问题,请参考以下文章

盈亏比 & 期望值

程序员也可以懂一点期望值管理

ACM选修hust 1075 组合+数学+期望值

属性语法中的实际值和期望值是啥?

JSONDecodeError:期望值

0311软件工程复利软件单利及期望值的实现