测试洗牌代码

时间:2015-07-21 10:14:02

标签: c shuffle

我正在测试我编写的一些代码来混淆数组的元素。虽然不是真正的专业测试,但我对结果感到疑惑  我生成了一个随机数组并保持混洗,直到数组被排序。我期望获得排序顺序的次数,大约是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);
    }
}

1 个答案:

答案 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