我正在测试一些我写入洗牌数组元素的代码。虽然不是真正的“专业测试”,但我对结果感到疑惑。
我生成了一个随机数组,并保持洗牌,直到数组排序。我预计获得排序顺序的次数约为n!/ 2,并且最大的随机播放需要在n!左右,其中n是阵列中元素的数量。洗牌代码测试
有5个元素,洗牌次数平均为108次左右,6次为615左右。 我很惊讶地发现,即使我只有5个元素,某些洗牌花费了500次以上。
我的问题是,有没有这个结果的解释,和/或我的理由是预期洗牌是否正确? 我的洗牌码
void shuffle(int* array, int length)
{
int i=0;
int r =0;
for(i=0;i<length;i++)
{
r = randomInRange(0,i);
swap(array,i,r);
}
}
这就是着名的[bogosort](https://en.wikipedia.org/wiki/Bogosort)。 – pmg
排序的顺序是n中的一个!可能的订单。如果混洗以相等的概率产生每个订单1/n!排序所需的洗牌次数具有[几何分布](https://en.wikipedia.org/wiki/Geometric_distribution),其预期值为n !. – Joni
最坏的情况是无界的。性能也可能取决于随机数的分布。 – Daniele