【问题标题】:Generate 3 random numbers from 1 to 25? (Java)生成 3 个从 1 到 25 的随机数? (爪哇)
【发布时间】:2013-03-17 20:13:38
【问题描述】:

所以,我正在尝试生成一个长度为 3 的数组,其中包含从 1 到 25 的随机 唯一 数字。我不明白为什么我的代码不起作用,我将不胜感激一些帮助!

public void generateRandom() {
    for(int j=0; j<3; j++) {
        dots[j] = (int) (Math.random()*(col*row)+1);
        System.out.println(dots[j]);
        for(int i=j; i>0; i--) {
            if(dots[j]==dots[j-1]) {
                generateRandom();
            }
        }
    }
}

dots[] 是我试图存储 3 个唯一随机数的数组。顺便说一句,col*row == 25

【问题讨论】:

  • 等等...为什么使用 for in for 然后递归?

标签: java arrays random unique


【解决方案1】:

这里有一点不同的方法。它依赖于创建一个具有指定值集的 ArrayList,然后对该列表进行混洗。一旦列表被打乱,您就可以根据打乱列表中的前三个元素创建一个数组。

public static void main(String[] args) {
    List<Integer> list = new ArrayList<Integer>();
    for(int i = 0; i < 26; i++){
        list.add(i);
    }

    Collections.shuffle(list);
    Integer[] randomArray = list.subList(0, 3).toArray(new Integer[3]);

    for(Integer num:randomArray){
        System.out.println(num);
    }
}

【讨论】:

  • 用这种方法打败我。如果范围相当小,这是实现这一点的直接方法。
【解决方案2】:
for(int j=0;j<3;j++)
    dots[j]=(int)(Math.random()*Integer.MAX_VALUE)%25+1;

由于您的Math.random 无论如何都是一个随机数,因此乘以Integer.MAX_VALUE 不会影响随机性。另外,如果您想解释为什么您的代码不起作用,那是因为如果数字相对较小,例如在0.001 下,乘法时通过获取 int 将得到 0。

【讨论】:

    【解决方案3】:

    每次 generateRandom 调用自身时,它都会从第一个随机数重新开始,而不是为当前位置选择一个新的随机数。

    【讨论】:

    • 那应该没关系吧?因为无论如何,最终数组会用 3 个随机数填充自己。
    • 如果是这样的话,你一开始就不会有问题。
    【解决方案4】:

    这是方法

    public void generateRandom() {
        for(int j=0; j<3; j++) {
          boolean f;
          do { 
            dots[j] = (int) (Math.random()*(col*row)+1);
            f = false;
            for(int i=j-1; i>=0; i--) {
                if(dots[i]==dots[j]) {
                  f = true;
                  break;
                }
            }
            if (!f)
              System.out.println(dots[j]);
          } while (f);
       }
    }
    

    它会重复生成数字,直到找不到重复项。

    【讨论】:

      猜你喜欢
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2014-03-19
      • 2014-06-23
      • 2011-12-29
      • 1970-01-01
      相关资源
      最近更新 更多