这可能已经被问到了,但我有点难以理解。我创建了一个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]);
}
以及输出:
我设法用不同的方法解决了这个问题:
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;
}
}
我注意到,这种方式效率更高。
我没看到问题。您的System.out.println(tes[i]);
正在循环中
你的数组只有以下整数:5,9,2,7,1
在自己的循环中生成println
for (int i = 0; i < tes.length; i++) {
System.out.println(tes[i]);
}
因为你使i=i-1;
一个值被多次打印
如果想要一个没有重复项的集合,则应使用集合:
Random r = new Random();
int desirableSize = 5;
Set<Integer> uniques = new HashSet<>(desirableSize);
while(uniques.size() < desirableSize){
uniques.add(r.nextInt(10));
}
System.out.println(uniques);
add方法已经确保,如果集合中已经存在值,则不会添加该值。
布尔加法(E)
如果指定的元素尚未存在,则将其添加到此集合(可选操作)。
我使用了HashSet,但是如果插入顺序对您很重要,请使用LinkedHashSet:
正如PJ所指出的,上述方法在以下情况下适用:
desireablesize
远小于池大小,但如果desireablesize在池大小中占很大比例,则最好对池进行洗牌,然后选择第一个desireablesize元素。
具体如下:
int start = 0;
int end = 10;
int size = 5;
List<Integer> collect = IntStream.rangeClosed(start, end)
.boxed()
.limit(size)
.collect(Collectors.toList());
Collections.shuffle(collect);
System.out.println(collect);
有理数如下(引用pjs):
对于基于拒绝的方案,例如重复尝试添加到集合中,预期的迭代次数是O(池大小*日志(期望大小)),集合的存储为O(期望大小)。洗牌是O(池大小),但洗牌需要O(池大小)存储。如期望大小-
或者更非正式地说,从一组有限的可能数中提取的唯一有限数越高,使用第二种方法就越可取。
例如,如果一个人生成从0到1000的数字,并且只对5个数字感兴趣,因为随机选择相同数字的可能性较低,他最好使用第一种方法。然而,如果你对800个数字感兴趣,那么你最好生成和洗牌1000个数字,并从中提取800个唯一值。
在内存方面,第一种方法比第二种方法更好,但是在性能方面,它取决于我们已经描述过的上下文。
问题内容: 似乎找不到答案,说我有这个: 我如何使随机数不会重复出现。例如,如果随机数是2,我不希望2再次出现。 问题答案: 您可以通过多种方式实现这一目标。 解决方案A:如果数字范围不大(假设少于10个),则只需跟踪已生成的数字即可。然后,如果生成重复项,则将其丢弃并生成另一个数字。 解决方案B:预先生成随机数,将其存储到数组中,然后遍历数组。您可以通过提取数字然后将其洗牌来实现。 解决方案C:
我试图创建一个没有重复的随机数组。 任务是从用户那里获取一个整数数组和最大值,用0到最大值之间的随机数填充数组,并显示没有重复的随机数组,不使用任何其他类,除了随机和扫描仪。 这是一个示例输出: 请输入数组的大小:10 请输入最大值:50 [39,2,17,49,12,19,40,31,42,15] 我需要帮助删除重复的内容。我不确定我所做的是否正确,我是一个初学者,但这是我目前所做的。非常感谢帮
问题 你想要获得两个整数(包含在内)之间的一个随机整数。 解决方案 使用以下的函数。 randomInt = (lower, upper) -> [lower, upper] = [0, lower] unless upper? # 用一个参数调用 [lower, upper] = [upper, lower] if lower > upper #
可能重复:数组值计数javascript 我有一个数组,其中包含几个重复项,我试图实现的是计算每个唯一字符串在这个数组中有多少重复项。 数组看起来像这样 因此我想做这样的事情 但我不确定该如何编写代码。我在想,用每个唯一的字符串创建一个对象,然后在原始数组中循环,将每个字符串与其对象匹配,并将其数字增加1,然后在对象上循环,以查看哪些单词具有最多的重复项。。。 但这似乎是一种过于复杂的方法。
问题内容: 该代码从一组预设颜色中选择一种随机颜色。如何使同一颜色不会被多次拾取? 问题答案: 创建一个索引数组。从数组中删除索引之一,然后使用它来获取颜色。 像这样: 上面的代码创建一个数组。该函数看是否为空。如果是,则使用0到的索引值填充它。 然后,它在数组中选择一个随机索引,从数组中的该索引处删除值,然后使用它从中获取并返回一个对象。(它不会从中删除对象。它使用间接操作,并从indexsAr
我有这门课,对我来说很好。它给出了5位随机数。我无法做到的是,这5个数字彼此不同,我的意思是没有重复的5位数字。