用于生成从1到n的随机数字列表的算法的正确性

时间:2013-09-18 12:25:46

标签: algorithm random

给定函数Random(x, y),它返回xy之间的随机数(包括)。设计算法以打印从1n的unique_random_numbers列表。 列表中必须有n个数字,每个数字只能出现一次。

e.g。

PrintRandomList(1, 5) can print -> 2, 5, 1, 4, 3    
PrintRandomList(1, 6) can print -> 4, 1, 6, 3, 2, 5

我已经能够提出算法,但无法证明它会生成一个真正的随机列表(假设Random(x, y)将生成真正的随机数)。

void PrintRandomList(int a, int b) {
    if(a<=b) {
        int pivot = Random(a, b);
        printf("%d ", pivot);
        PrintRandomList(a, pivot-1);
        PrintRandomList(pivot+1, b);    
    }
}

我的问题:算法是否正确?如果是,那么我们可以证明算法的正确性吗?

如果这个算法是正确的,我们也可以使用它来改组数组而不是使用Knuth Shuffling算法。

2 个答案:

答案 0 :(得分:3)

证明此算法是否有效的根本问题的技巧是您必须证明每个结果同样可能。正如其他人所指出的那样,情况并非如此。

如果您能找到任何无法到达或甚至不太可能到达的序列,那么您就知道该算法不是“公平的”#34;。这个论点的反面证明了它是。

答案 1 :(得分:1)

您的算法不正确,大多数情况下,从1到n / 2的数字将在返回列表的前半部分(假设枢轴返回大约n / 2)。 (不容易证明它不正确^^)

你需要多思考一下,但如果你问我们可以给出提示