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

Correctness of algorithm for generating a random list of numbers from 1 to n

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

例如

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

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

1
2
3
4
5
6
7
8
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混洗算法。


证明该算法是否有效的根本问题的技巧是,您必须证明每个结果都是同等可能的。正如其他人指出的,这里不是这种情况。

如果您找到任何无法到达或什至不太可能到达的序列,那么您就知道该算法是不公平的。这个论点的反证证明是。


您的算法不正确,大多数情况下,从1到n / 2的数字将位于返回列表的前半部分(想象中,pivot大约返回n / 2)。 (不容易证明它也是不正确的^^)

您需要多想一点,但是如果您要求我们提供提示,