给定一个函数,它返回一个介于和(包括)Random(x, y)
之间的随机数。设计一个算法来打印从到的 unique_random_numbers 列表。列表中必须有数字,并且每个数字只能出现一次。x
y
1
n
n
例如
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 洗牌算法。