Algorithm 生成从1到n的随机数字列表算法的正确性
给定一个函数Algorithm 生成从1到n的随机数字列表算法的正确性,algorithm,random,Algorithm,Random,给定一个函数Random(x,y),该函数返回一个介于x和y(包括)之间的随机数。设计一种算法来打印从1到n的唯一随机数列表。 列表中必须有n个数字,每个数字只能出现一次 e、 g 我已经提出了一个算法,但无法证明它将生成一个真正的随机列表(假设random(x,y)将生成真正的随机数) void打印随机列表(int a,int b){ 如果(a您的算法不正确,则大多数情况下,从1到n/2的数字将位于返回列表的前半部分(假设pivot返回大约n/2)。(也不容易证明它不正确^^) 你需要多想一想
Random(x,y)
,该函数返回一个介于x
和y
(包括)之间的随机数。设计一种算法来打印从1
到n
的唯一随机数列表。
列表中必须有n
个数字,每个数字只能出现一次
e、 g
我已经提出了一个算法,但无法证明它将生成一个真正的随机列表(假设random(x,y)
将生成真正的随机数)
void打印随机列表(int a,int b){
如果(a您的算法不正确,则大多数情况下,从1到n/2的数字将位于返回列表的前半部分(假设pivot返回大约n/2)。(也不容易证明它不正确^^)
你需要多想一想,但是如果你问,我们可以给你一些提示,证明这个算法是否有效的根本问题的诀窍是你必须证明每个结果都是同样可能的。正如其他人所指出的,这里不是这样的
如果你能找到任何无法达到或甚至不太可能达到的序列,那么你就知道算法是不“公平”的。这个参数的相反证明了它是公平的。试着在同一输入上运行你的算法数次。@devull:这“证明”没什么…很容易看出它不可能是正确的。它从来不会生成像2,3,1这样的序列。它是100%正确的。你需要一个数学证明。我没有。我的数学表达式不好。还有很多方法可以覆盖数组。@hasan还有其他反例,一个是3,2,4,1在这个算法中,我首先打印轴而不是go在左半部比在右半部好。如果我随机决定先走那一半(左半部或右半部),那么算法正确吗?@AbhinavChauhan在上面的问题中看到我的评论,没有;因为有一个可预测的模式。
PrintRandomList(1, 5) can print -> 2, 5, 1, 4, 3
PrintRandomList(1, 6) can print -> 4, 1, 6, 3, 2, 5
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);
}
}