程序仅使用特定值进入无限循环

Program entering in a infinite loop only with a specific value

我刚从 java 开始,当时正在做一个关于排列的练习(练习要求使用数组 a[] 创建 N 个元素的排列,满足没有 a[i] 相等的要求到 i.) 我已经创建了以下代码。在测试它时,我意识到它有时会在特定的 N = 6 时进入无限循环。 关于问题出在哪里的任何想法?

public class GoodPerm {
    public static void main(String arg[]) {
        int n = Integer.parseInt(arg[0]);

        int[] guests = new int[n];
        for (int i = 0; i < n; i++) {
            guests[i] = i;
        }
        for (int i = 0; i < n; i++) {
            int r = i + (int) (Math.random() * (n - i));
            int q = guests[r];
            guests[r] = guests[i];
            guests[i] = q;
            if(guests[i] == i){
                i --;
            }
        }
        for(int q : guests){
            System.out.println(q);
        }
    }
}

也许代码进入了另一个值的 inf 循环,但我没有找到任何其他值。

这段代码总是可以进入一个inf循环。据我了解代码,您尝试进行一些随机切换以获得所需的结果。但是如果你的数组的最后一个元素从未被切换过,那么它就不可能切换到任何 "later/higher" 位置(因为没有更多)。在第二个 for 循环的 "last" 迭代中(因此 i + 1 == n 在开始时保持不变) r 将始终评估为 i 因此不会发生真正的切换。如果最后一个元素仍然存在,你将永远重复这个。