Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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_Random_Duplicates - Fatal编程技术网

Java 具有随机整数但无重复项且显示第一个数字的数组

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

这可能已经被问过了,但我有点难以理解。我创建了一个for循环,将随机整数添加到数组中,但是当整数已经在数组中时,重新启动循环。但是我一直在数组中输入相同的整数,当已经有重复的时候,数组的大小会增加。有人知道我做错了什么吗

        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));
一些逻辑问题