我在网站上看到了这个问题(我不会使用确切的措辞或提及网站),
假设一个孩子在每个月的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日星期一,或者问题可能有任何答案,或者我错过了一些非常重要的东西?
对此应该是什么正确答案?
如果没有“正确的”答案,那么您认为哪一个应该是最合适的?
答案 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年期限的开始。