現在轉盤抽獎的活動是層出不窮。最近也做了一個。當然這裡是一個實現的簡單例子,可以根據我們的需要去新增其他內容。
這裡實現的方式就是根據我們設定的機率來做一個隨機數的演算法,得到我們的獎品。下面就貼上我們的代碼來直接看。
import java.math.BigDecimal;import java.util.ArrayList;import java.util.List;import com.thinkive.base.jdbc.DataRow;public class TurnTable {static Object[][] prizeArr = new Object[][]{ //裡面的指標轉動 {1,"一等獎",0.0001}, {2,"不要灰心",39.9994}, {3,"祝您好運",20.0}, {4,"二等獎",0.0002}, {5,"再接再厲",20.0}, {6,"運氣先攢著",10.0}, {7,"三等獎",0.0003}, {8,"謝謝參與",10.0} };Object result[] = award(prizeArr);//抽獎後返回獎品等級及獎品描述//抽獎後返回獎品等級及獎品描述 public static Object[] award(Object[][] prizeArr){ //機率數組 float obj[] = new float[prizeArr.length]; for(int i=0;i<prizeArr.length;i++){ obj[i] = Float.parseFloat(prizeArr[i][2].toString()); } Integer prizeId = getRand(obj); //根據機率擷取獎項號碼 String msg = (String) prizeArr[prizeId][1];//獎品資訊 Integer prizeIds = prizeId +1; System.out.println("獎品號: "+prizeIds +" 獲獎等級:"+msg); return new Object[]{prizeId,msg}; }//根據機率擷取獎項 public static Integer getRand(float obj[]){ Integer result = null; try { float sum = 0.0f;//機率數組的總機率精度 float min = 0.0f;// for(int i=0;i<obj.length;i++){ BigDecimal beforSum = new BigDecimal(Float.toString(sum)); BigDecimal objValue = new BigDecimal(Float.toString(obj[i])); sum = beforSum.add(objValue).floatValue(); } for(int i=0;i<obj.length;i++){//機率數組迴圈 BigDecimal db = new BigDecimal(Math.random() * (sum - min) + min); BigDecimal b = new BigDecimal(Float.toString(obj[i])); if(compareMethod(db,b) == -1){//中獎 result = i; break; }else{ sum -=obj[i]; } } } catch (Exception e) { e.printStackTrace(); } /** * 獎品控制碼,這裡可以控制我們的獎品的等級 * **/ return result; }public static void main(String[] args) {DataRow data = new DataRow();//此處DataRow為封裝了的 HashMapList<DataRow> resultList = new ArrayList<DataRow>();for (int i = 0; i < 10000; i++) {int k = 1;Object result[] = award(prizeArr);//抽獎後返回角度和獎品等級String prize = "";String comment = "";for (Object object : result) {if(k==1){prize = object.toString();}else if(k==2){comment = object.toString();}k++;}if(k==3){data.set("prize", Integer.valueOf(prize)+1);data.set("comment", comment);resultList.add(data);}}}public static int compareMethod(BigDecimal a,BigDecimal b){return a.compareTo(b);}} 首先我們先來看看我們的獎品初始化,就是這段代碼了
static Object[][] prizeArr = new Object[][]{ //裡面的指標轉動 {1,"一等獎",0.0001}, {2,"不要灰心",39.9994}, {3,"祝您好運",20.0}, {4,"二等獎",0.0002}, {5,"再接再厲",20.0}, {6,"運氣先攢著",10.0}, {7,"三等獎",0.0003}, {8,"謝謝參與",10.0} }; 這裡我們可以在對象中添加更多的參數,如果你的抽獎是需要角度的或者獎品位置的那你就加入角度資料(兩個值,一個開始一個結束),同時也需要根據角度資料產生一個隨機數。
整個程式最主要的就是這一個抽獎演算法了。在這裡我們可以控制獎品的等級,數量等等,具體的需要自己去添加啦,這裡僅實現了抽獎。這裡有個小小的建議,在傳入獎品數組的時間可以把大機率的排在前面,這樣抽獎的時候演算法迴圈的次數會有一定的減少。
//根據機率擷取獎項 public static Integer getRand(float obj[]){ Integer result = null; try { float sum = 0.0f;//機率數組的總機率精度 float min = 0.0f;// for(int i=0;i<obj.length;i++){ BigDecimal beforSum = new BigDecimal(Float.toString(sum)); BigDecimal objValue = new BigDecimal(Float.toString(obj[i])); sum = beforSum.add(objValue).floatValue(); } for(int i=0;i<obj.length;i++){//機率數組迴圈 BigDecimal db = new BigDecimal(Math.random() * (sum - min) + min); BigDecimal b = new BigDecimal(Float.toString(obj[i])); if(compareMethod(db,b) == -1){//中獎 result = i; break; }else{ sum -=obj[i]; } } } catch (Exception e) { e.printStackTrace(); } /** * 獎品控制碼,這裡可以控制我們的獎品的等級 * **/ return result; } 以上就是轉盤抽獎演算法了。希望對有需要的程式員們有一定協助。