你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
输入关键字进行搜索
搜索:
没有找到相关结果
xmczzxy - 。。。
推荐来自: asayahaku
要回答问题请先登录或注册
1 个回答
xmczzxy - 。。。
推荐来自: asayahaku
采用+5的方法,车号从0到9被选中的天数分别为:
71、79、72、72、71、71、79、72、72、71
采用+3的方法,车号从0到9被选中的天数分别为:
71、79、71、71、79、72、72、72、72、71
+5或者+3对于概率并没有显著影响,但从这里可以得到一些有趣的结论。
猜测以上两者是同一组数的不同置换,下面我们证明这个猜想:
我们先考虑车号与日期不同的情况:
构建一个映射f,把一个日期(mm/dd)映射到个位整数(dd+k) mod 10 (dd表示二位数的日期,比如02,10,31)
构建另一个映射g,g(mm/dd)=(dd+j) mod 10
j,k是互不相等且小于10的正整数,表示 k, j的方案
观察两个映射,我们发现,对于同一个日期(mm/did)
f(mm/dd)=[g(mm/dd)+k-j] mod 10
再构建一个函数h(n)=(n+k-j) mod 10,显然这是个置换
于是,f(mm/dd)=h[g(mm/dd)]
f,g的定义域相同,h是个置换,所以把g的值域用h置换后,f,g映射的图像是相同的。也就是说,g值域上任意一个数n,它所对应的日期,在f映射下都回到h(n)。换句话说,g值域上n对应的日期数,与f值域上h(n)对应的日期数是一样的。+k和+j把同样一组天数用不同的排列方式分给各个车号。
再考虑k=0,即车号与日期相同,这其实也是对其他映射的一个置换,且任何一个方案,都包含了这个置换。所以任意一个k不等于0的方案,其实就是0和k两个映射的叠加。每个车号对应的天数,其实是两个置换在同一个车号对应的天数相加。
构建一个置换排列的加法,对两个置换排列在同位置上的数相加得到一组新的数。 比如(123)+(231)=(354)。很显然只有在极凑巧的情况下,两个置换相加会构成一个新的置换
容易验证,k=1的时候 这不是k=3时的置换,所以车号对应的天数并不是置换。。。
所以我证了半天发现自己的猜测是错误的lol
算了,还是证明不管怎么加,被选中的概率都差不多。
假设只允许车号与日期相同时出行(k=0), 0到9号每年可通行天数为 x0,……,x9, 它们大致相等
(不相等的话证个毛线?)
已经证明的是, +k方案给每个车号额外增加的天数是x0到x9的一个置换
那对于任意车号,它的通行天数可以表示为 xj+xk,j,k不相等。 由于xj,xk,x0大致相等, 认为它们的和是2x0
所有车号的可通行天数都约等于2x0,所以不管+多少, 各个车号可出行的概率都大致相等
下面提供一段代码验证:
int main()
{
int bias=3; //这里bias=3 说明是+3的方案,更改这个数值可以得到不同方案的结果
int days_in_months[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //一年中每个月的天数
int num_count[10]={0,0,0,0,0,0,0,0,0,0}; //一年中不同车号可通行的天数
for (int month=0;month<12; month++) //每个月都循环一次
{
int days = days_in_months[month]; //这个月的天数
for (int date=1; date<=days; date++) //这个月每天都循环一次
{ // 回答里似乎无法显示百分号,下面两行代码里的&其实应该改成百分号^_^
num_count[date&10]++; //该日期对应的车号,可通行天数+1
num_count[(date+bias)&10]++; //该日期+bias对应的车号,可通行天数+1
}
}
for (int i=0; i<10; i++)
{ // num表示车号, count表示一年里可通行的天数
cout << "number: " << i << " count: " << num_count << endl;
}
}
用C++运行以上代码,就发现不管bias怎么变,一年中差不多都只有1/5的天数可以出行 这也算个证明吧