无重复Java的随机元素生成
我试图让这段代码在没有重复的情况下运行,但在这方面的研究没有成功 这是我正在做的一个问题的开始,它将要求用户输入缺少的元素。然而,当我生成随机元素时,我会得到重复的元素无重复Java的随机元素生成,java,arrays,duplicates,Java,Arrays,Duplicates,我试图让这段代码在没有重复的情况下运行,但在这方面的研究没有成功 这是我正在做的一个问题的开始,它将要求用户输入缺少的元素。然而,当我生成随机元素时,我会得到重复的元素 import java.util.Random; public class QuestionOneA2 { public static void main(String[] args) { String[] fruit = {"orange", "apple", "pear", "bannana",
import java.util.Random;
public class QuestionOneA2 {
public static void main(String[] args) {
String[] fruit = {"orange", "apple", "pear", "bannana", "strawberry", "mango"};
Random numberGenerator = new Random();
for (int i = 0; i < 5; i++) {
int nextRandom = numberGenerator.nextInt(6);
System.out.println(fruit[nextRandom]);
}
}
}
import java.util.Random;
公开课问题A2{
公共静态void main(字符串[]args){
字符串[]水果={“橙色”、“苹果”、“梨”、“班纳纳”、“草莓”、“芒果”};
随机数生成器=新随机数();
对于(int i=0;i<5;i++){
int nextRandom=numberGenerator.nextrant(6);
System.out.println(水果[nextRandom]);
}
}
}
生成随机数时,我建议将其添加到数组中
然后,当你生成下一个数字时,做一些搜索(谷歌搜索一些有效的东西),检查这个数字是否已经在数组中,因此,已经被使用
如果是,生成一个新的,如果不是,使用它
可以通过将其嵌套在while循环中来实现这一点
虽然,从你的问题中我可以看出,你最好使用ArrayList创建一个水果数组的副本,然后,当你生成一个随机数来选择一个水果,简单地把这个水果从这个新的列表中删除,减去你正在生成的随机数的范围。 < P>有很多不同的方法可以考虑,这取决于算法应该是多么的灵活。 从6个元素的列表中选择5个随机元素,与从6个元素的列表中选择1个您未选择的元素相同。这是一个非常不灵活但非常容易的方法 另一种方法是从列表中删除元素,并减少最大随机数。因此,我建议不要使用
字符串[]
fruit.remove(fruit[nextRandom]);
可能是删除子方法吗?将数组复制到
列表中,然后将其洗牌,然后逐个拾取元素:
List<String> copy = new ArrayList<>(Arrays.asList(fruit));
Collections.shuffle(copy);
for (String f : copy)
System.out.println(f);
List copy=newarraylist(Arrays.asList(fruit));
收藏。洗牌(复制);
for(字符串f:复制)
系统输出打印ln(f);
如果我理解正确,那么您希望从n个元素的列表中随机选择n-1个元素。如果是,那么我建议随机选择一个,然后选择所有其他的
Arrays.shuffle(fruit);
int notThis = numberGenerator.nextInt(6);
for(int i = 0; i < fruit.length; i++)
if(i!=notThis) System.out.println(fruit[i]);
array.shuffle(水果);
int notThis=numberGenerator.nextInt(6);
for(int i=0;i
您可以使用集合
验证随机生成的数字是否重复。您只需不断生成随机数
,直到找到唯一的随机数,然后将其添加到集合
,以防止重复
下面是一个快速代码片段:
public static void main(String[] args) {
String[] fruit = {"orange", "apple", "pear", "bannana", "strawberry", "mango"};
Random numberGenerator = new Random();
/* Generate A Random Number */
int nextRandom = numberGenerator.nextInt(6);
Set<Integer> validate = new HashSet<>();
/* Add First Randomly Genrated Number To Set */
validate.add(nextRandom);
for (int i = 0; i < 5; i++) {
/* Generate Randoms Till You Find A Unique Random Number */
while(validate.contains(nextRandom)) {
nextRandom = numberGenerator.nextInt(6);
}
/* Add Newly Found Random Number To Validate */
validate.add(nextRandom);
System.out.println(fruit[nextRandom]);
}
}
您可以将int包装成“integer”并将其添加到Set中。集合不包含重复项,因此其中只有唯一的值。因此,只需检查集合是否已使用Set.contains(Integer)指定整数。我的个人解决方案:
private static int[] randomIndexes(int len) {
int[] indexes = new int[len];
for (int i = 0; i < len; i++) {
indexes[i] = i;
}
for (int i = len - 1, j, t; i > 0; i--) {
j = RANDOM.nextInt(i);
t = indexes[j];
indexes[j] = indexes[i];
indexes[i] = t;
}
return indexes;
}
私有静态int[]随机索引(int len){
int[]索引=新的int[len];
对于(int i=0;i0;i--){
j=随机。下一个(i);
t=指数[j];
索引[j]=索引[i];
指数[i]=t;
}
收益指标;
}
查看它的实际操作:我认为使用ArrayList和控制随机数的生成会更容易,如下所示
import java.util.Random;
public class QuestionOneA2 {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("orange");
fruits.add("apple");
fruits.add("pear");
fruits.add("bannana");
fruits.add("strawberry");
fruits.add("mango");
Random numberGenerator = new Random();
int nextRandom;
for (int i = 0; i < 6 ; i++) {
nextRandom = numberGenerator.nextInt(6 - i);
System.out.println(fruits.get(nextRandom));
fruits.remove(nextRandom);
}
}
}
import java.util.Random;
公开课问题A2{
公共静态void main(字符串[]args){
列表结果=新的ArrayList();
水果。添加(“橙色”);
水果。添加(“苹果”);
水果。添加(“梨”);
添加(“班纳纳”);
水果。加入(“草莓”);
水果。添加(“芒果”);
随机数生成器=新随机数();
int nextRandom;
对于(int i=0;i<6;i++){
nextRandom=numberGenerator.nextInt(6-i);
System.out.println(fruits.get(nextRandom));
水果。移除(nextRandom);
}
}
}
所以你想从一组6个项目中随机选择5个项目?应用Collections.shuffle()
对填充列表进行排序是的,我想从6个项目中随机选择5个,不重复。各位,非常感谢大家的帮助,有没有办法从数组中随机删除一个元素?这可能是执行TaskArray的一种更简单的方法。Array没有remove
方法。二进制搜索仅在排序arrays@SashaSalauyou没错,不知道我在想什么哈哈!如果他这样做,他可能会一次又一次地得到同样的订单。例如,如果apple
被排除,则订单将为OPBSM
;如果pear
被排除,则订单将为OABSM
。在这两种情况下,Orage
的顺序都是固定的,即0。然后先洗牌水果,然后这个问题也会得到解决:数组。在打印结果之前必须添加洗牌(水果)。我将此添加到我的解决方案中是的,洗牌
就可以了。将其存储在字符串中是我尝试做的一项要求
import java.util.Random;
public class QuestionOneA2 {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("orange");
fruits.add("apple");
fruits.add("pear");
fruits.add("bannana");
fruits.add("strawberry");
fruits.add("mango");
Random numberGenerator = new Random();
int nextRandom;
for (int i = 0; i < 6 ; i++) {
nextRandom = numberGenerator.nextInt(6 - i);
System.out.println(fruits.get(nextRandom));
fruits.remove(nextRandom);
}
}
}