簡體   English   中英

在Java中隨機生成的數組中重復

[英]duplicates in randomly generated array in Java

我正在參加CS 2010課程。 以前從未從事過編碼工作或類似的工作。 我的老師很好,但是他的口音很濃,很難理解。 他最近給了我們一個項目,要在幾天內完成。 我在完成項目的最后一部分時遇到了問題。

該項目要求您在0-9999之間生成10,000個隨機數,並將它們排列為10,000個數字的數組,而無需重復其中的任何一個。 如您所見,這基本上是在要求您使數組將數字0-9999按從最小到最大的順序放入數組。 我的問題是非重復數字。 我已經在代碼上工作了四個多小時,試圖弄清楚如何使其不再重復並且沒有運氣。 我在網上搜索了至少一個小時,所有其他提示或解決方案均無濟於事。 這是我到目前為止的代碼,任何人都可以幫助我嗎?

 package array.sorter.project;

import java.util.Arrays;
import java.util.Random;

public class Sorting {
public static void main(String args[]){
int[] randomNumbers = new int[10000];

Random rand = new Random();{
for (int i = 1; i < randomNumbers.length; i++) {
  int n = rand.nextInt(10000);
  randomNumbers[i] = n;}


  for (int i = 0; i < randomNumbers.length; i++) {
      int smallestNo = randomNumbers[i];
      int posWithSmallest = i;
      for (int j = i+1; j < randomNumbers.length; j++) {
        int val = randomNumbers[j];
        if (val < smallestNo) {
          smallestNo = val;
          posWithSmallest = j;
        }
      }
      int tmp = randomNumbers[i];
      randomNumbers[i] = smallestNo;
      randomNumbers[posWithSmallest] = tmp;
}
Arrays.sort(randomNumbers);

for (int i = 0; i < randomNumbers.length; i++) {
      System.out.println("Position " + i + " : " + randomNumbers[i]);
    }



    }

}

}

而不是從0到9999隨機生成10000個數字,而是以升序生成0 ... 9999並隨機排列數組。 確保您的混洗沒有偏見,例如,有n! 它可以完成的方式(如果不確定,請使用n = 3進行檢查,以確保其是否公正)

您不能在0-9999范圍內生成10000個無重復的隨機整數,只有10000個,所以您需要全部。

你可以做的是重新排列隨機播放它們。

所以:

  import java.util.Collections;
  import java.util.Arrays;

  ...
  int[] ten_thousand = new int[10000];
  for (int i=0; i < 10000; i+=1) ten_thousand[i] = i;
  return Collections.shuffle(Arrays.asList(ten_thousand));

了解你的武器:)

如果您不想使用隨機播放

private static int[] generateRandom(int count) {
    int[] randomNumbers = new int[count];

    Set<Integer> checker = new HashSet<Integer>();

    Random rand = new Random();
    for (int i = 0; i < count;) {
        int nextInt = rand.nextInt(count);
        if (!checker.contains(nextInt)) {
            randomNumbers[i++] = nextInt;
            checker.add(nextInt);
        }
    }

    return randomNumbers;
}

我已經編寫了O(n)算法來解決此問題,這是受《 編程珍珠》第二版啟發的。下面是代碼,我將在稍后進行解釋:

    /**
 * randomly select k numbers in [0,n),and sort them in random order.(k<=n)
 */
public static int[] getRandomArray(int n, int k) {
    if (k > n) {
        k = n;
    }
    int[] rets = new int[k]; // store the random ordered number
    int[] array = new int[n];// original array that array[i] is i
    for (int i = 0; i < n; i++)
        array[i] = i;
    Random random = new Random();
    for (int j = 0; j < k; j++) {
        // generate a random number between [j,n) as index
        int index = j + random.nextInt(n - j);
        // swap array[j] and array[index],so array[0..j] are all non-repeat
        // random number
        int temp = array[index];
        array[index] = array[j];
        array[j] = temp;
        // store it in rets
        rets[j] = temp;
    }
    return rets;
}

說明:

to generate non-repeating 10,000 random numbers between 0-9999 

可以考慮將數字0-9999按隨機順序排列 。1,k數存儲在array ,其中x在x位置。

2,對於數字j,從[j,n)中隨機選擇一個索引,即索引,

3,將j的位置從j交換到索引,(eq交換索引處的數字到j的位置)

4,將j從0循環到k,

暫無
暫無

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

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