Java 具有随机整数但无重复项且显示第一个数字的数组
这可能已经被问过了,但我有点难以理解。我创建了一个for循环,将随机整数添加到数组中,但是当整数已经在数组中时,重新启动循环。但是我一直在数组中输入相同的整数,当已经有重复的时候,数组的大小会增加。有人知道我做错了什么吗Java 具有随机整数但无重复项且显示第一个数字的数组,java,arrays,random,duplicates,Java,Arrays,Random,Duplicates,这可能已经被问过了,但我有点难以理解。我创建了一个for循环,将随机整数添加到数组中,但是当整数已经在数组中时,重新启动循环。但是我一直在数组中输入相同的整数,当已经有重复的时候,数组的大小会增加。有人知道我做错了什么吗 Random r = new Random(); int[] tes = new int[5]; for (int i = 0; i < tes.length; i++) { int q = r.ne
Random r = new Random();
int[] tes = new int[5];
for (int i = 0; i < tes.length; i++) {
int q = r.nextInt(10);
for (int j = 0; j < i; j++) {
if (q == tes[j]){
i=i-1;
}
}
tes[i] = q;
System.out.println(tes[i]);
}
Random r=new Random();
int[]tes=新的int[5];
对于(int i=0;i
以及输出:
我看没有问题。
您的System.out.println(tes[i])代码>处于循环中
您的数组只有以下整数:5,9,2,7,1
在自己的循环中生成println
for (int i = 0; i < tes.length; i++) {
System.out.println(tes[i]);
}
for(int i=0;i
因为你使i=i-1代码>一个值被多次打印我看不出有问题。
您的System.out.println(tes[i])代码>处于循环中
您的数组只有以下整数:5,9,2,7,1
在自己的循环中生成println
for (int i = 0; i < tes.length; i++) {
System.out.println(tes[i]);
}
for(int i=0;i
因为你使i=i-1代码>一个值被多次打印我设法用另一种方式解决它:
List<Integer> tes = new ArrayList<>(5);
Random r = new Random();
for (int i = 0; i < 5; i++) {
int testNummer = r.nextInt(10);
if(!tes.contains(testNummer)) {
tes.add(testNummer);
System.out.println(testNummer);
}else{
i=i-1;
}
}
List-tes=newarraylist(5);
随机r=新随机();
对于(int i=0;i<5;i++){
int testNummer=r.nextInt(10);
如果(!tes.contains(testNummer)){
tes.add(testNummer);
System.out.println(testnumer);
}否则{
i=i-1;
}
}
我注意到,这种方法效率更高。我用另一种方法解决了这个问题:
List<Integer> tes = new ArrayList<>(5);
Random r = new Random();
for (int i = 0; i < 5; i++) {
int testNummer = r.nextInt(10);
if(!tes.contains(testNummer)) {
tes.add(testNummer);
System.out.println(testNummer);
}else{
i=i-1;
}
}
List-tes=newarraylist(5);
随机r=新随机();
对于(int i=0;i<5;i++){
int testNummer=r.nextInt(10);
如果(!tes.contains(testNummer)){
tes.add(testNummer);
System.out.println(testnumer);
}否则{
i=i-1;
}
}
我注意到,这种方法更有效。如果您想要一个没有副本的集合,您应该使用:
有理数如下(引用):
使用基于拒绝的方案,例如重复尝试添加到
设置时,预期迭代次数为O(池大小*
日志(desirableSize)),具有集合的O(desirableSize)存储。
洗牌是O(池大小),但需要为
洗牌正如DesiredSize->poolsize一样,洗牌在预期的时间内获胜
迭代,并在存储方面具有竞争力。部分洗牌
实现时,洗牌的迭代次数为
O(理想大小),尽管存储保持不变
或者更非正式地说,从有限的可能数字集合中提取的唯一有限数字集合越高,使用第二种方法就越可取
例如,如果一个人生成从0到1000的数字,并且只对5个数字感兴趣,因为随机选择相同数字的概率较低,那么使用第一种方法会更好。但是,如果您(相反)对800个数字感兴趣,那么最好生成1000个数字并将其洗牌,然后从中提取800个唯一值
在内存方面,第一种方法比第二种方法更好,但在性能方面,它取决于我们已经描述过的上下文。如果您想要一个没有副本的集合,您应该使用:
有理数如下(引用):
使用基于拒绝的方案,例如重复尝试添加到
设置时,预期迭代次数为O(池大小*
日志(desirableSize)),具有集合的O(desirableSize)存储。
洗牌是O(池大小),但需要为
洗牌正如DesiredSize->poolsize一样,洗牌在预期的时间内获胜
迭代,并在存储方面具有竞争力。部分洗牌
实现时,洗牌的迭代次数为
O(理想大小),尽管存储保持不变
或者更非正式地说,从有限的可能数字集合中提取的唯一有限数字集合越高,使用第二种方法就越可取
例如,如果一个人生成从0到1000的数字,并且只对5个数字感兴趣,因为随机选择相同数字的概率较低,那么使用第一种方法会更好。但是,如果您(相反)对800个数字感兴趣,那么最好生成1000个数字并将其洗牌,然后从中提取800个唯一值
在内存方面,第一种方法比第二种方法更好,但在性能方面,它取决于我们已经描述过的上下文。如果您想要一种生成唯一值的简单方法,可以使用流来实现
Random r = new Random();
int minVal = 1;
int upperBound = 20;
int count = 10;
只要count
小于upperBound-minVal
它将在没有重复项的情况下完成。对于具有适当范围的非常大的计数,可能需要一些时间
int[] unique = r.ints(minVal, upperBound).distinct().limit(count).toArray();
System.out.println(Arrays.toString(unique));
打印像这样的东西
[14, 1, 7, 13, 5, 16, 2, 8, 12, 4]
生成固定范围的随机数的一种简单方法是简单地洗牌数组
Integer[] vals = new Integer[20];
for (int i = 0; i < vals.length; i++) {
vals[i] = i+1;
}
// Object array will be shuffle since it backs up the list.
Collections.shuffle(Arrays.asList(vals));
System.out.println(Arrays.toString(vals));
如果您想要一种生成唯一值的简单方法,可以使用流来实现
Random r = new Random();
int minVal = 1;
int upperBound = 20;
int count = 10;
只要count
小于upperBound-minVal
它将在没有重复项的情况下完成。对于具有适当范围的非常大的计数,可能需要一些时间
int[] unique = r.ints(minVal, upperBound).distinct().limit(count).toArray();
System.out.println(Arrays.toString(unique));
打印像这样的东西
[14, 1, 7, 13, 5, 16, 2, 8, 12, 4]
生成固定范围的随机数的一种简单方法是简单地洗牌数组
Integer[] vals = new Integer[20];
for (int i = 0; i < vals.length; i++) {
vals[i] = i+1;
}
// Object array will be shuffle since it backs up the list.
Collections.shuffle(Arrays.asList(vals));
System.out.println(Arrays.toString(vals));
一些逻辑问题