-1

我在cs 2010班。以前从未从事过编码或类似工作。我有一个很好的老师,但他的口音很浓,很难听懂。他最近给了我们一个项目,要在几天内完成。我在完成项目的最后一部分时遇到了问题。

该项目要求您生成 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

4 回答 4

2

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

于 2013-04-19T03:01:25.233 回答
2

您无法在 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));

了解你的武器:)

于 2013-04-19T03:03:50.530 回答
1

如果您不想使用随机播放

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;
}
于 2013-04-19T03:14:23.013 回答
0

受《 Programming Pearls, 2nd Edition》一书的启发,我写了一个 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,

于 2013-04-19T03:19:53.363 回答