在Java中随机生成的数组中重复

时间:2013-04-19 02:55:39

标签: java arrays

我参加了2010年的cs班。从来没有在编码之前或之类的任何工作。我有一位老师,但他的口音非常浓重,很难理解。他最近给了我们一个项目,要完成几天。我在完成项目的最后一部分时遇到了问题。

项目要求您在0-9999之间生成10,000个随机数,并将它们排列在10,000个数字的数组中,而不重复任何数字。正如您所看到的,这基本上是要求您使数组按照从最小到最大的顺序将数字0-9999放在数组中。我的问题是不重复的数字。我一直在研究代码超过4个小时,试图找出如何让它不重复,没有运气。我在网上搜索了至少一个小时,所有其他提示或解决方案都没有帮助。这是我到目前为止的代码,有人可以帮助我吗?

 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]);
    }



    }

}

}

4 个答案:

答案 0 :(得分:2)

不是从0到9999随机生成10000个数字,而是按升序生成0 ... 9999并生成shuffle数组。确保您的改组不偏不倚,例如有n!它可以完成的方式(如果你不确定,桌面检查n = 3,看它是否是无偏见的)

答案 1 :(得分:2)

你不能在没有重复的情况下在0-9999范围内生成10000 随机整数,那时只有10000,所以你需要全部。

您可以做的是重新排列shuffle

所以:

  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));

了解你的武器:)

答案 2 :(得分:1)

如果你不想使用shuffle

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;
}

答案 3 :(得分:0)

我已经编写了一个O(n)算法来解决这个问题的灵感来自本书 Programming Pearls,2nd Edition 。代码如下:我将在稍后解释:

    /**
 * 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交换到索引,(e.q。将索引处的数字交换到位置j)

4,循环j从0到k,