Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中随机生成的数组中的重复项_Java_Arrays - Fatal编程技术网

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

Java中随机生成的数组中的重复项,java,arrays,Java,Arrays,我在cs 2010班。以前从未从事过编码或类似的工作。我有一个不错的老师,但他的口音很重,很难听懂。他最近给了我们一个需要几天才能完成的项目。我在完成项目的最后一部分时遇到了问题 该项目要求您在0-9999之间生成10000个随机数,并将它们排列成10000个数字的数组,而不重复任何数字。如您所见,这基本上是要求您使数组按从最小到最大的顺序将数字0-9999放入一个数组中。我的问题是不重复的数字。我已经花了4个多小时来编写代码,试图找出如何使代码不再重复,但一直没有成功。我在网上搜索了至少一个小

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

该项目要求您在0-9999之间生成10000个随机数,并将它们排列成10000个数字的数组,而不重复任何数字。如您所见,这基本上是要求您使数组按从最小到最大的顺序将数字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]);
    }



    }

}

}

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

您无法生成0-9999范围内的10000个无重复的随机整数,只有10000个,因此您需要全部

你所能做的就是重新排列它们

因此:


了解你的武器:

如果你不想使用洗牌

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

受《编程珍珠》(Programming Pearls,第二版)一书的启发,我编写了一个关于解决这个问题的算法。代码如下,我将在后面解释:

    /**
 * 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;
}
可以考虑以随机顺序排列数字0-9999 1,k编号存储在数组中,其中x位于x位置

2,对于数字j,从[j,n,这是索引

3,将j的位置从j交换到索引,e.q.将索引处的数字交换到位置j


4,从0到k循环j,

正如你所看到的,这基本上是要求你将数字0-9999按从最小到最大的顺序排列在一个数组中。不,我实际上不明白。作业对排序意味着什么?我有一个不错的老师,但他的口音很重,很难理解。通过电子邮件或o进行交流therwise in Write.10k随机数,介于0到9999之间&无需重复。你甚至不需要为此编写太多代码!只需用0到9999之间的数字填充数组,就完成了!@MattBall你好,对不起,我应该发布教授的确切说明。1.编写一个程序名sorting.java,它将使用数组随机存储10000个生成的数字范围从1到10000无重复数字2。使用选择排序算法按升序对数字进行排序。3.显示排序的序列,每行仅显示一个数字。这是解决方案的可能副本。由于这是一个分配,她可能无法利用无序排列方法。因此…Se“我必须编写她自己的洗牌方法,这应该非常简单,应该是一个很好的学习练习。谢谢你的帮助,但正如你在评论中看到的,确切的说明是按升序排列数组。这让我感到困惑,因为我认为这只意味着将数字0-9999按顺序排列。”数组,但这对于编程课程来说似乎非常简单。@user2297587我不明白。要么你需要对重复的随机数进行排序,要么洗牌非重复的随机数。或者可能洗牌非重复的随机数,打印,然后排序,打印,以证明你可以同时做这两件事?@user2297587-不是每个复杂的问题都有一个共同的答案复杂的解决方案!所以…要么你不理解赋值,要么赋值是创建一个有序数组,洗牌,然后重新排序。你们能帮我检查一下我的代码吗?int i=0;i@EvgeniyDorofeev:在Java 7下,它就是这样。有一个语法错误,但在另一个地方。请尝试System.out.printlnArrays.asListten_千禧.size;它打印1不是10000,因为它应该是您选择使用for循环的任何特殊原因吗?@MarcoForberg没有特殊原因,我认为while会更好。性能仍然很差。想象一下,在最后几次迭代中,大多数数字已经被取下,而rand.nextInt几乎总是无法生成拟合数字。@9000是的,但是不使用洗牌的其他方法是什么
    /**
 * 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