- Unduplicated Random Numbers
最近看到有人使用陣列元素移除的方式來產生不重複亂數,下面就是一個簡單的不重複亂數產生的範例,亂數範圍0~99,產生10個不重複亂數。
Method One (Array Splice):
var numSet:Array = new Array();
var numArr:Array = new Array();
var randNum:int;
var n:int = 0;
for (var i:int = 0; i < 100; i++) {
numSet[n++] = i;
}
for (i = 0; i < 10; i++) {
randNum = Math.floor(Math.random()* 99);
numArr[i] = numSet[randNum];
numSet.splice(randNum, 1);
}
上面的程式碼裡,只要有出現過的數字就在集合裡把他給移除,這樣的作法很直觀易懂,但是所付出的運算時間代價也比較高。下面是另一個我比較常用的手法:
Method Two:
var numSet:Array = new Array();
var numArr:Array = new Array();
var randNum:int;
for (var i:int = 0; i < 100; i++) {
numSet[i] = 0;
}
for (i = 0; i < 10; i++) {
do {
randNum = Math.floor(Math.random()* 99);
} while (numSet[randNum]);
numSet[randNum] = 1;
numArr[i] = randNum;
}
numSet裡面所存的並不是亂數數字的集合,而是對應到每個數字的flag,用來標示此數字是否已經產生,這樣的作法乍看之下好像比耗空間(例如數字集合是在10000~20000時),但其實你可以透過一些簡單的運算技巧讓空間的消耗跟數字集合數成比例。
使用第二個方法的效能會比第一個快許多,尤其當集合數增大時,差距會更明顯。
No comments:
Post a Comment