从1到25生成3个随机数? (JAVA)

时间:2013-03-17 20:13:39

标签: java arrays random unique

所以,我正在尝试生成一个长度为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

4 个答案:

答案 0 :(得分:5)

这是一种有点不同的方法。它依赖于创建具有指定值集的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);
    }
}

答案 1 :(得分: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。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这是方法

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

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