樂透彩開獎這題目必須要用到亂數,JAVA有提供Random()函數來幫助我們取得亂數,而取得Random的方式有兩種,一種是在Math裡取得第二種是透過JAVA.util.Random的類別取得前者可以直接以Math.取得後者必須有物件才可取得,當然就是用前者比較方便,一般來說Random是一個double型態,而範圍是在0到1(不包含1),所以我們需要1到49號的話要怎樣表示呢,可以透過49*Math.Random()+1輸出為double型別,所以必須給他強制轉型為int型態,那重點來了為何是49*Math.Random()+1呢,這邊來記錄一下,因為前面說到Random()的範圍是在0到1(不包含1),所以現在我想要1到49,第一步就是先觀察自己需要的數範圍大小是多少,這邊1到49就是49個數,所以我們就把49乘上0<=Random()<1就會得到0<=Random()<49,之後在這邊0<=Random()<49變成也是49個數了,第二步再把最小值加上去,這邊最小值是1,所以0<=Random()<49都加上1,最後這範圍就會是我們想要的範圍1<=Random()<50,這範圍就是樂頭彩1到49號的範圍了。

自我練習
package lab01;

import java.util.*;
public class 樂透 {
    Scanner sc = new Scanner(System.in);
    private int 開獎號碼, 買了幾組 = 1;
    private int 中了幾個 = 0;
    private ArrayList list2;//放入所有號碼
    private ArrayList list3;//動態陣列放入中獎號碼
    private ArrayList listArray;//存入我買的號碼ArrayList型態物件

    public 樂透() {
        list2 = new ArrayList();
        list3 = new ArrayList();
        listArray = new ArrayList();
    }
    private void 判斷幾組() {
        boolean isGo = true;
        String temp;
        while (isGo) {
            ArrayList a = 輸入你買號碼();
            do{
            System.out.println("還有其他組嗎(輸入YES或NO)");
            temp = sc.next();
            listArray.add(a);
            switch (temp) {
                case "YES":
                    isGo = true;
                    買了幾組++;
                    break;
                case "NO":
                    isGo = false;
                    break;
                default:
                    System.out.println("輸入錯誤");
            }
            }while(!temp.equals("YES")&&!temp.equals("NO"));
        }
    }
    public void 啟動() {
        判斷幾組();   
        開獎();
        中了幾個();
    }  
    public void 開獎() {
        放入所有號碼();
        for(int i=0;i<6;i++)
            隨機選取一號碼();
        顯示中獎號碼();     
    }
    private ArrayList 輸入你買號碼() {
        ArrayList a = new ArrayList();
        boolean isgo = true;
        System.out.println("輸入你買6個號碼: 1~49");
        while (isgo) {
            if (a.size() > 5) {
                System.out.println("已輸入6個號碼了");
                isgo = false;
            } else {
                int n = sc.nextInt();
                if (a.contains(n)) {
                    System.out.println("已輸入過,再輸入一次");
                } else if (n<1||n>49) {
                    System.out.println("輸入正確數字好嗎");
                } else {
                    a.add(n);
                }
            }
        }
        System.out.println("輸入完畢");
        return a;     
    }
    private void 中了幾個() {
        int k;
        for(k=0;k<買了幾組;k++){
            for (int i = 0; i < list3.size(); i++) {
                 for (int j = 0; j < listArray.size(); j++) {
                    if (list3.get(i) == listArray.get(k).get(j)) {
                         中了幾個++;
                     }
                 }
             }
             System.out.println("第"+(k+1)+"組中了" + 中了幾個 + "個");
        }     
    }
   private void 放入所有號碼(){
        for(int i =0;i<=42;i++){
            list2.add(i);
        }
    }
    private void 隨機選取一號碼() {
            int n = list2.size();//所有號碼陣列的大小,只要備remove()一次,裡面的大小就會減少1次
            int temp = (int) (n * Math.random());//隨機產生0到48的索引值,因為list2容器要裝49個數字,所以索引編號會從0到48而已
            開獎號碼 = list2.remove(temp);//在所有號碼裡面拿出亂數產生的索引值對應的值放進開獎號碼,並且移除陣列的值,每remove()一次都會讓list.size()減少1
            放入中獎碼陣列();
        }
    }
    private void 顯示中獎號碼() {
        System.out.println("開獎號碼有:");
        for (int n : list3) {
            System.out.print(n + ",");
        }
        System.out.println();
    }
    private void 放入中獎碼陣列() {
        list3.add(開獎號碼);
    }
}
 

樂透.jpg

註:由主類別main進入,建立樂透物件,並使用樂透的啟動程式方法,結果就會產生右圖結果,這段程式判斷你輸入對不對以及中了幾個號碼的功能。

文章標籤
創作者介紹
創作者 KV 的頭像
KV

kevin的部落格

KV 發表在 痞客邦 留言(0) 人氣()