接下來講到
亂數不重複這塊 我想大家如果想要電腦每次都從1023開始猜,想必很笨吧?
要讓電腦更像人一樣,就要用亂數,一開始就隨機猜一個有可能的數字出來
但先前條件 1A2B條件 希望大家還記得一件事.... 1122 1223 這種重複數字是不可能出來的....
於是我們先用一個陣列來標記 0代表不可能 1代表可能!
但但但 這邊為了方便大家學習 查看程式碼 也希望大家自己能在前兩章的學習中 能自己處裡1122 1223這種重複的數字會把陣列 [1123 1122等]給0 1023這類有可能的索引值給1
所以這邊"暫時"就不提了.... 之後再說
取而代之的 我就預設 我要用亂數產生5 6 7 15 16這幾個數字只能一次 不能重複 順序不能一樣(這樣才像人再猜的時候情況.....) 其他 8 9 10 11 這些數字不可以出來 (就像是1123 這種重複數字不可以出來一樣)
所以我們需要先產生一個亂數 在這之前
亂數需要先預載
我們直接 打import java.util.*; 把所有都直接java.util 的東西所有都撈進來
接著需要一個陣列來標記是否可以用而且要到16
所以.....static int[] box3=new int[17];
創一個陣列是0~16 總共17個格子 而裡面內值的預設值是0
如:System.out.print(box3[10]); 那麼這個結果顯示會是0
接下來我們先把我要的 5 6 7 15 16這幾個數字 都在陣列box3 中先標記1吧
for(i=5;i<=7;i++) { box3[i]=1; //System.out.println(i+":"+box3[i]); } for(i=15;i<=16;i++) { box3[i]=1; //System.out.println(i+":"+box3[i]); }標記好後....我們就來產生一個亂數變數 設定一個整數 int ran1=0;
ran1=(int)(Math.random()*(16-4)+5);//5~16 接下來介紹這個亂數函數
基本上Math.random()要是只有這段 他只會產生0~1這個範圍的亂數
所以就要轉型(int) 接下來...因為我要亂數是從5~16
所以 (16-4)這邊是範圍 5~16 包含5 包含16 共12個數字 後面的+5代表最小5開始
接下來亂數設定好後 還記得陣列裡面內值是1的才代表有可能 0不可能對吧?
接著注意 4個重點!
1.陣列值設"0~16"
2.亂數"5~16"
3.我要的條件 5 6 7 15 16 這幾個數字(總共5次出現) 所以用while迴圈 確認有才+1 否則繼續產生 不過實際上1023~9876亂數產生的終止點應該是整個陣列都內值被設為0時 代表使用者亂輸入 所以亂數不管產生多少 都不可能是答案 這裡只是簡單帶過 之後要寫再寫詳細的....
4.亂數不可能照著大家喜歡想產生哪個數就哪個數所以要加條件(這時候陣列的標記就有用了)
第一二步我們都做過了 所以從第三步開始...這邊ran2或許是多餘的.. 隨意
for(i=5;i<=7;i++) while(ck<=5) { ran1=(int)(Math.random()*(16-4)+5);//5~16 if(box3[ran1]==1) { ran2=ran1; System.out.println(ran2); box3[ran1]=0; ck++; } }這邊重點就是如果我產生的亂數box3搜尋到內值是1就顯示 ck++ 如果不是就繼續產生
那因為索引值跟亂數值是一樣的數值範圍 請見4個重點中 第1 2 點
所以 box3[亂數值]==1 就是我要的 抓到值後 這個數字在下一次亂數就不可以產生了
所以box3[亂數值]=0 也就是off的意思囉
以上....
下面為亂數不重複完整程式碼
import java.util.*; public class RandomNoRepeat { static int[] box3=new int[17]; static int i=0,j=0,ran1=0,ran2=0,ck=0; public static void main(String args[]) { prefill(box3); while(ck<=5) { ran1=(int)(Math.random()*(16-4)+5);//5~16 if(box3[ran1]==1) { ran2=ran1; System.out.println(ran2); box3[ran1]=0; ck++; } } } public static void prefill(int[] box3) { for(i=5;i<=7;i++) { box3[i]=1; //System.out.println(i+":"+box3[i]); } for(i=15;i<=16;i++) { box3[i]=1; //System.out.println(i+":"+box3[i]); } } }
沒有留言:
張貼留言