隨機取值在程式開發的世界裡用到的頻率也蠻高的,尤其是多媒體開發感覺就一定要給他隨機一下才會比較有Fu 。(一切都是艾的自以為)
梗鋪很少是因為不想說太多廢話,所以我們直接切入主題,先來談談最平常的隨機取值吧。
假設我們有ABCD四個項目,希望按了按鈕之後隨機取出一個:
//Actionscript3
var item:Array=new Array("A","B","C","D");
btn.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDownHandler);
function onMouseDownHandler(e:MouseEvent):void{
//取得0≦ran≦item.length-1的整數,此例可能的值是0,1,2,3
var ran:Number=Math.floor(Math.random()*item.length);
trace(item[ran]);
}
很簡單吧!不過上述的取法每個項目被取到的機率都是相同的。在一般情況的隨機取值會是以均等的方式來處理…那如果當遇上需要比例不同的情況該怎麼做呢?
假設我們依然有ABCD四個項目,他們被選中的機率分別是10%、20%、30%、40%,按了按鈕之後依此比例隨機選出一個:
//Actionscript3
var item:Array=new Array("A","B","B","C","C","C","D","D","D","D");
btn.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDownHandler);
function onMouseDownHandler(e:MouseEvent):void{
//取得0≦ran≦item.length-1的整數,此例可能的值是0,1...8,9
var ran:Number=Math.floor(Math.random()*item.length);
trace(item[ran]);
}
聰明的你應該看出來我們把項目陣列的值依比例做增加,再用相同的方式去隨機選一,如此就巧妙的達成了依比例隨機選值。
但…殘酷的事情來了,若各項目的比例是沒有辦法簡化的情況該怎麼辦呢?例如:A:1% ; B:99% 這種中獎率低到一個不行的情況。
是的…如果你覺得用複製貼上99個B也沒有什麼了不起的,那以下內容你可以跳過(但這樣你對得起艾寫得這麼辛苦嗎?我哩咧!)。
不過,我相信各位不是複製貼上魔人,所以我們就往下看看加強版吧!
假設我們到最後還是只有ABCD四個項目,他們被選中的機率分別是9%、19%、31%、41%,按了按鈕之後依此比例隨機選出一個:
//Actionscript3
var item:Array=new Array(["A",9],["B",19],["C",31],["D",41]);
var temp:Array=new Array();
for(var i:int=0;i<item.length;i++){
for(var j:int=0;j<item[i][1];j++){
temp.push(item[i][0]);
}
}
btn.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDownHandler);
function onMouseDownHandler(e:MouseEvent):void{
//取得0≦ran≦temp.length-1的整數,此例可能的值是0,1...98,99
var ran:Number=Math.floor(Math.random()*temp.length);
trace(temp[ran]);
}
其實也沒有變得很難,只是利用二維陣列與巢狀迴圈產生一個新的陣列,並忠實的把每個項目應有的數量塞進去,再用老方法去取得。
這邊使用的是二維陣列,可能有的人會覺得不好懂,當然你也可以把項目和比例拆開來放,不過彼此的索引要對好喲!不然比例可是會錯亂呢。
(那個1:99的情況就當作是題目讓各位練習囉!)
嘿咻嘿咻…搬家不搬腦