一种经验方法。
让我们在Mathematica中实现错误的算法:
p = 10; (* Range *)
s = {}
For[l = 1, l <= 30000, l++, (*Iterations*)
a = Range[p];
For[k = 1, k <= p, k++,
i = RandomInteger[{1, p}];
temp = a[[k]];
a[[k]] = a[[i]];
a[[i]] = temp
];
AppendTo[s, a];
]
现在获取每个整数在每个位置的次数:
r = SortBy[#, #[[1]] &] & /@ Tally /@ Transpose[s]
让我们在结果数组中占据三个位置,并绘制该位置上每个整数的频率分布:
对于位置1,频率分布为:
对于位置5(中)
对于位置10(最后):
在这里,您将所有位置的分布都绘制在一起:
在这里您可以更好地统计8个职位:
一些观察:
- 对于所有位置,概率“ 1”相同(1 / n)。
- 概率矩阵关于大反对角线对称
- 因此,最后一个位置上任何数字的概率也是均匀的(1 / n)
您可以查看从同一点开始的所有线(第一个属性)和最后一条水平线(第三个属性)的起点,以可视化那些属性。
从下面的矩阵表示示例中可以看到第二个属性,其中行是位置,列是乘员数,颜色表示实验概率:
对于100x100矩阵:
编辑
只是为了好玩,我计算了第二个对角元素的精确公式(第一个是1 / n)。其余的工作都可以完成,但这是很多工作。
h[n_] := (n-1)/n^2 + (n-1)^(n-2) n^(-n)
验证值从n = 3到6({8/27,57/256,564/3125,7105/46656})
编辑
在@wnoise答案中计算一些一般的显式计算,我们可以获得更多信息。
用p [n]代替1 / n,因此计算不予评估,例如,我们得到n = 7的矩阵的第一部分(单击以查看大图):
在与其他n值的结果进行比较之后,让我们确定矩阵中一些已知的整数序列:
{{ 1/n, 1/n , ...},
{... .., A007318, ....},
{... .., ... ..., ..},
... ....,
{A129687, ... ... ... ... ... ... ..},
{A131084, A028326 ... ... ... ... ..},
{A028326, A131084 , A129687 ... ....}}
您可以在精美的http://oeis.org/中找到这些序列(在某些情况下具有不同的符号)
解决一般问题比较困难,但我希望这是一个开始