2016年6月16日 星期四

JAVA-亂數產生四個不重複的數字

這裡會說明兩種方法1.衛兵法 2.洗牌法

當然還有其他方法如HashSet,就留給大家自行找答案了.

產生亂數數字不重複的四位數程式碼:




public class NoRepeat4Number {
    private int[] randomnumber = new int[4];   //紀錄產生的四位數字 randomnumber[0]為千位數 ...randomnumber[3]為個位數字
    private int[] temp = new int[10];          //0~9共10個位子
    private int index = 0;
//衛兵法
    int[] prod1() {
        randomnumber[3] = 11;                //把個位數字先塞個不可能出現的數字 表示個位數字尚未產生隨機數字
        //一直做到個位數randomnumber[3]被改過為止
        while (randomnumber[3] == 11) {
            int select = (int) (Math.random() * 10);   //隨機產生0~9的亂數
            //如果該數字的位子沒有衛兵則取用
            if (temp[select] == 0) {
                randomnumber[index] = select;
                temp[select] = 1;
                index = index + 1;
            }
        }
        return randomnumber;
    }

//洗牌法
    int[] prod2() {
        //先將0~9數字依照位子塞進temp陣列
        for (int i = 0; i < temp.length; i++) {
            temp[i] = i;
        }
        for (int i = 0; i < temp.length; i++) {
            int select = (int) (Math.random() * 10); //隨機產生0~9的亂數
            //隨機選出的位子不能等於i
            int swaptemp=0;
            if(select!=i){
                swaptemp=temp[i];
                temp[i]=temp[select];
                temp[select]=swaptemp;
            }
        }
        //洗牌好的前四個數字塞回我們要回傳的陣列
        for (int i = 0; i < randomnumber.length; i++) {
            randomnumber[i]=temp[i];
        }        
        return randomnumber;
    }

}

main  class的程式碼:

public class NorepeatNumber {
    public static void main(String[] args) {
        // TODO code application logic here
        NoRepeat4Number no4=new NoRepeat4Number();
        int[]  myrandom=no4.prod2();      //決定方法1(prod1)或方法2(prod2)
        for(int i=0;i<myrandom.length;i++){
            System.out.printf(myrandom[i]+" ");
        }      
    }

}

沒有留言:

張貼留言