2016年12月18日 星期日

(1A2B遊戲)手把手教你如何光源氏計畫培養電腦成為你的1A2B遊戲伴侶 Part3 亂數不重複




接下來講到
亂數不重複這塊 我想大家如果想要電腦每次都從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]);
  }




 }  
 

}

沒有留言:

張貼留言