簡體   English   中英

Java排列2

[英]Java permutations 2

大約一周前,我問了一個有關幫助我解決此問題的問題

Java排列

,而打印排列方法存在問題。 我整理了一下代碼,並有了一個可以運行的示例,盡管如果5在數組的第5位,則不會打印它。 任何幫助將非常感激。

 package permutation;

public class Permutation {

static int DEFAULT = 100;

public static void main(String[] args) {
    int n = DEFAULT;
    if (args.length > 0)
        n = Integer.parseInt(args[0]);
    int[] OA = new int[n];
    for (int i = 0; i < n; i++)
        OA[i] = i + 1;
    System.out.println("The original array is:");
    for (int i = 0; i < OA.length; i++)
        System.out.print(OA[i] + " ");
    System.out.println();
    System.out.println("A permutation of the original array is:");
    OA = generateRandomPermutation(n);
    printArray(OA);
    printPermutation(OA);
}

static int[] generateRandomPermutation(int n)// (a)
{
    int[] A = new int[n];
    for (int i = 0; i < n; i++)
        A[i] = i + 1;
    for (int i = 0; i < n; i++) {
        int r = (int) (Math.random() * (n));
        int swap = A[r];
        A[r] = A[i];
        A[i] = swap;
    }
    return A;
}

static void printArray(int A[]) {
    for (int i = 0; i < A.length; i++)
        System.out.print(A[i] + " ");
    System.out.println();
}

static void printPermutation(int[] p)

{
    int n = p.length-1;
    int j = 0;
    int m;
    int f = 0;

    System.out.print("(");
    while (f < n) {
        m = p[j];
        if (m == 0) {
            do
                f++;
            while (p[f] == 0 && f < n);
            j = f;
            if (f != n)
                System.out.print(")(");
        } 
        else {
            System.out.print(" " + m);
            p[j] = 0;
            j = m - 1;
        }
    }
    System.out.print(" )");
}
}

我不太瘋

int n = p.length-1;

其次是

while (f < n) {

因此,如果p為5個單位長,並且f從0開始,則循環將從0到3。這似乎排除了數組中的最后一個元素。

您可以使用Collections類的shuffle方法

Integer[] arr = new Integer[] { 1, 2, 3, 4, 5 };
List<Integer> arrList = Arrays.asList(arr);
Collections.shuffle(arrList);
System.out.println(arrList);

我不認為將每個元素與其他隨機元素交換不會產生排列的均勻分布。 最好從其余值中統一選擇:

Random rand = new Random();
ArrayList<Integer> remainingValues = new ArrayList<Integer>(n);
for(int i = 0; i < n; i++)
    remainingValues.add(i);
for(int i = 0; i < n; i++) {
    int next = rand.nextInt(remainingValues.size());
    result[i] = remainingValues.remove(next);
}

請注意,如果需要考慮運行時間的順序,則以這種能力使用ArrayList的時間為n平方時間。 有一些數據結構可以在n log n次之內處理此任務,但是它們非常重要。

這不能解決您確定的問題。

而是我認為它標識了您的generateRandomPermutation(int n)proc的一個錯誤。

如果您從生成的隨機數中添加打印品(如我在下面所做的那樣),然后運行proc幾次,它可以讓我們檢查是否要隨機選擇陣列中的所有元素。

static int[] generateRandomPermutation(int n)
{
    int[] A = new int[n];
    for (int i = 0; i < n; i++)
        A[i] = i + 1;
     System.out.println("random nums generated are: ");
    for (int i = 0; i < n; i++) {
        int r = (int) (Math.random() * (n));
         System.out.print(r + " ");

運行proc幾次。 你看見我看到的了嗎?

傑瑞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM