Java如何添加一个排除某个数字的随机生成器?

时间:2013-11-11 15:37:18

标签: java random arraylist

假设我想生成从ArrayList中取得的随机数:(1,2,3,4,5,6,7,8,9,10)

随机生成器产生5.

列表更新 - AL:(1,2,3,4,6,7,8,9,10)

下一个随机数不能为5.


我正在编写一个从arraylist生成随机数的程序,一旦生成随机数,列表就会删除该数字,下一个随机生成的数字不能是该数字。

ArrayList<Integer> numsLeft = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9,10));

  Random randomGenerator = new Random();

 int number = 0; 
 String cont;

 do
 {
 number = randomGenerator.nextInt(numsLeft.size()); 
 numsLeft.remove(number);

  System.out.println (number + " continue (y/n)");
  cont = (stdin.readLine());
 } 
 while (cont.equalsIgnoreCase("y"));      

但我唯一能做的就是缩小尺寸......

http://docs.oracle.com/javase/7/docs/api/java/util/Random.html

5 个答案:

答案 0 :(得分:5)

更简单的方法是简单地随机播放列表,然后使用随机排序的数字:

List<Integer> nums = new ArrayList<Integer>();
for (int i = 1; i < 11; i++)
    nums.add(i);
Collections.shuffle(nums);

现在它们是随机顺序,只是逐个使用它们:

for (Integer i : nums) {
    // use i
}

答案 1 :(得分:0)

您可以创建可用数字的数组。然后,随机数生成器为您提供该数组中您想要的数字的位置。 可能链接列表或其他东西会更有效,但概念是相同的。 所以,举个例子,你第一次拉5。第二次,你在列表中有这个: 1,2,3,4,6,7,8,9 如果您的随机数再次为5,则第五个位置为6.弹出六个,将7,8,9移到一个,并将随机数生成器递减为1-8而不是1-9。继续。

当然,看看你的代码,看起来这就是你想要做的事情。

您的代码似乎有什么问题?你得到了什么结果?

答案 2 :(得分:0)

number = randomGenerator.nextInt(numsLeft.size()); 
numsLeft.remove(number);

您现在正在打印要生成的随机索引,而不是从列表中删除的数字。那是你想要的吗?我想你真的是这个意思:

int index = randomGenerator.nextInt(numsLeft.size());
number = numsLeft.remove(index);

你也可以通过随机改组列表然后进行操作来实现:

List<Integer> numsLeft = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9,10));

// Shuffle the list randomly
Collections.shuffle(numsLeft);

do {
    // Remove the first number each time
    int number = numsLeft.remove(0);

    System.out.println (number + " continue (y/n)");
    cont = (stdin.readLine());
} while (cont.equalsIgnoreCase("y"));

答案 3 :(得分:0)

为什么不创建哈希映射来处理这个问题。所以你的哈希映射可以包含类似

的东西
Map[(1,1), (2,2), (3,3), ...] or Map[(1,true), (2,true), (3,true), ...]

因此,如果您生成一个数字,那么您可以执行以下操作:

String value = map.get(key); or boolean present = map.get(key); 

if(value != null) or if(value == present)

map.remove(key),或者您甚至可以更新数据,而不是删除密钥,您可以更新它,并添加删除的单词或如前所述的布尔值。但是通过这种方式,您可以跟踪地图中每个键值的所有条目和删除,这些键值将是您的数字列表。

答案 4 :(得分:0)

当列表很长时,

remove可能是相当昂贵的操作。随机播放 - 特别是如果你只需要一些数字。这是另一种算法(它很有名,但我现在无法找到来源)。

  1. 将您的N(有序)号码放入列表中
  2. 选择介于0和N-1之间的随机数
  3. 在位置m处选择元素。这是您唯一的随机数
  4. SWAP元素m与数组中的LAST元素
  5. 将N减少1
  6. 转到第2步
  7. 你&#34;搁置&#34;您在步骤4中使用的数字 - 但

    1. shuffle不同,您的初始化很快
    2. remove不同,您的remove操作只需移动一个元素(而不是平均N / 2)
    3. 与&#34;选择一个并拒绝,如果你在&#34;之前看到它,那么你选择一个新的&#34;随着拾取的元素数量的增加,数字不会减少。