2016-02-05 93 views
-4

我想让这段代码运行时没有重复,但是我没有成功研究这个区域。没有重复的随机元素生成Java

它是我正在做的问题的开始,它会要求用户输入缺少的元素。然而,当我产生随机元素我得到重复

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]); 
     } 


    } 

} 
+1

所以你试图从一组6项中选择5个随机项目? –

+1

将'Collections.shuffle()'应用于序列填充列表 –

+0

是的我试图从6中随机选择5而没有重复 – StudentCoder

回答

1

当你生成一个随机数,我建议将它添加到一个数组。

然后,当你生成你的下一个号码,做一些搜索(谷歌有效的东西),以检查该数字是否已经在数组中,因此,已被使用。

如果是,则生成一个新的,如果没有,则使用它。

你可以通过在while循环中嵌套它来做到这一点。

虽然从我的问题中可以看出,使用ArrayList创建水果数组的副本会更好,然后当您生成一个随机数来选择水果时,只需从该数组中删除该水果即可这个新的列表和递减你正在生成的随机数的范围。

+0

二进制搜索只能在排序的数组 –

+0

@SashaSalauyou正确,不知道我在想什么哈哈! – James

1

您可以考虑许多不同的方法,具体取决于算法应该有多灵活。

从6的列表中取5个随机元素,与您不选择的列表中的选择1元素相同。这是一个非常不灵活,但很容易。

另一种方法可能是从列表中删除元素,并减少最大随机数。在这个原因,我会建议不要使用String[]

+0

将它存储在字符串中是我试图执行的操作之一 – StudentCoder

-1
fruit.remove(fruit[nextRandom]); 

也许,是否删除子方法?

+2

数组没有'remove'方法。 –

0

您的阵列复制到List<String>,然后将它洗,然后随便挑元素逐一:

List<String> copy = new ArrayList<>(Arrays.asList(fruit)); 
Collections.shuffle(copy); 
for (String f : copy) 
    System.out.println(f); 
0

如果我理解正确的话,那么你要选择N-1个随机从列表中的元素n个元素。如果是,那么我建议随机选择一个,并采取所有其他。

Arrays.shuffle(fruit); 
int notThis = numberGenerator.nextInt(6); 
for(int i = 0; i < fruit.length; i++) 
    if(i!=notThis) System.out.println(fruit[i]); 
+0

如果他会这样做,那么他可能会一次又一次地得到相同的订单。例如,如果'apple'被排除,那么顺序将是'OPBSM',如果'pear'被排除,那么顺序将是'OABSM'。在这两种情况下,“Orage”的顺序都是固定的,即0. – user2004685

+1

然后先将水果洗牌,然后解决此问题:在打印结果之前必须添加Arrays.shuffle(水果)。我将这添加到我的解决方案 – thorshammer

+0

是的,'洗牌'会做到这一点。 – user2004685

1

您可以使用Set来验证随机生成的数字是否重复。您只需继续生成randomNumber,直到找到唯一的随机数,然后将其添加到Set以防止重复。

下面是一个简单的代码片段:

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]); 
     } 
} 

输出:

mango 
apple 
strawberry 
pear 
orange 
0

可以INT包装成 '基于整数' 并将其添加设置。 Set不保存重复,因此只有唯一的值。所以然后检查一个Set是否已经给Set.contains(Integer)赋予Integer。

0

我个人的解决方案:

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; 
} 

看到它在行动:https://gist.github.com/GautierLevert/a6881cff798e5f53b3fb

0

我认为它会使用一个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); 
     } 
     } 

}