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