有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

假设我想从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) 个答案

  1. # 1 楼答案

    为什么不创建一个哈希映射来处理这个问题呢。所以你的散列图可以包含

    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),或者您甚至可以更新数据,而不是删除密钥,您可以更新它,并添加单词removed或之前建议的布尔值。但通过这种方式,您可以跟踪地图中每个键值的所有条目和删除,这些键值将是您的数字列表

  2. # 2 楼答案

    你可以制作一个可用数字的数组。然后,随机数生成器为您提供所需数字在该数组中的位置。 也许一个链表或其他东西会更有效,但概念是一样的。 所以,以你的例子来说,你会在第一次拉5。第二次,你会在你的列表中列出: 1, 2, 3, 4, 6, 7, 8, 9 如果你的随机数又是5,第五位是6。弹出6个,将7、8、9移到1上,然后将随机数生成器从1-9减少到1-8。继续

    当然,看看你的代码,看起来你已经在尝试这么做了

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

  3. # 3 楼答案

    更简单的方法是简单地洗牌列表,然后按洗牌顺序使用数字:

    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
    }
    
  4. # 4 楼答案

    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"));
    
  5. # 5 楼答案

    当列表很长时,remove可能是非常昂贵的操作。洗牌也是一种选择——尤其是当你只需要几个数字的时候。这是另一个算法(它很有名,但我现在找不到源代码)

    1. 把你的N(有序)数字列在一个列表中
    2. 在0和N-1之间选择一个随机数m
    3. 在位置m处选取元素。这是你唯一的随机数
    4. 将元素m与数组中的最后一个元素交换
    5. 减量N减1
    6. 转至步骤2

    你“搁置”了你在第4步中使用的数字——但是

    1. shuffle不同,您的初始化速度很快
    2. remove不同,你的remove操作只需要移动一个元素(而不是平均N/2)
    3. 与“选择一个,如果你以前看到过就拒绝”不同,你选择“新”数量的效率不会随着选择的元素数量的增加而降低