我正在测试我编写的一些代码来混淆数组的元素。虽然不是真正的专业测试,但我对结果感到疑惑 我生成了一个随机数组并保持混洗,直到数组被排序。我期望获得排序顺序的次数,大约是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);
}
}
答案 0 :(得分:3)
为什么是n!/ 2?排列的数量是n !,所以在n之后! shuffles你只希望一次正确排序数字。没有最大数量的洗牌 - 使用5张牌,你在每次迭代时有119/120的机会获得无序结果,这可能会持续很长时间。
这是我编写的Python脚本的输出,用于计算从1到120正确猜测随机数所花费的次数:
[17, 43, 251, 72, 4, 10, 41, 61, 74, 22, 172, 49, 43, 66, 994, 99, 59, 88, 255, 48]
平均值为123.4,这与预期非常相似,但即使在这个小样本集中,个别值也在4到994之间。
但是,在您的情况下,结果略有不同。这是因为你正在使用一种改组算法来提供偏差的结果。 (Jeff Atwood has written a useful blog post on the subject.)
我建议你改用Fisher-Yates algorithm。