這裡會說明兩種方法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]+" ");
}
}
}
沒有留言:
張貼留言