[英]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.