AS3 快速產生不重覆亂數
AS3 快速產生不重覆亂數
AS3 的 Array 假如單純只有用 Array.NUMERIC 模式排序速度是夠快的
可是一旦用了自定的排序 function,速度就慢上一大截
那要如何利用 Array.NUMERIC 模式排序又能弄亂順序呢?
答案就是改用 sortOn function 來作排序
陣列內的元素改用物件,多一個屬性存放亂數
對亂數欄位作排序就可以了
可是一旦用了自定的排序 function,速度就慢上一大截
那要如何利用 Array.NUMERIC 模式排序又能弄亂順序呢?
答案就是改用 sortOn function 來作排序
陣列內的元素改用物件,多一個屬性存放亂數
對亂數欄位作排序就可以了
- // 產生 0 到 (n - 1) 不重複亂數陣列
- function genRandomArray(n:int):Array {
- var ary:Array = [];
- while (n) ary.push({n: --n, r: Math.random()});
- return ary.sortOn("r", Array.NUMERIC);
- }
- // 產生 0-9999 不重複亂數陣列
- var ra:Array = genRandomArray(10000);
- trace(ra[0].n); // 取出第一個不重複亂數
- trace(ra[1].n); // 取出第二個不重複亂數
這樣就完成了,速度夠快,而且程式碼也相當少
下面是另一種用隨機插入陣列的方式產生不重覆亂數
不過速度比原生的 Array 排序慢一些
不過速度比原生的 Array 排序慢一些
- // 產生 0 到 (n - 1) 不重複亂數陣列
- function genRandomArray(n:int):Array {
- var ary:Array = [];
- while (n) ary.splice(Math.random() * ary.length, 0, --n);
- return ary;
- }
- // 產生 0-9999 不重複亂數陣列
- var ra:Array = genRandomArray(10000);
- trace(ra[0]); // 取出第一個不重複亂數
- trace(ra[1]); // 取出第二個不重複亂數
當天下午,不斷思考是否還有更快速的方式
結果又有更重大的發現
只要把一堆亂數塞入陣列
然後同時結合 Array.NUMERIC、Array.RETURNINDEXEDARRAY 模式作排序
馬上就拿到不重複的亂數陣列了
在我的 NB 上跑 0-9999 不重複亂數只要 10ms 而已
結果又有更重大的發現
只要把一堆亂數塞入陣列
然後同時結合 Array.NUMERIC、Array.RETURNINDEXEDARRAY 模式作排序
馬上就拿到不重複的亂數陣列了
在我的 NB 上跑 0-9999 不重複亂數只要 10ms 而已
- // 產生 0 到 (n - 1) 不重複亂數陣列
- function genRandomArray(n:int):Array {
- var ary:Array = [];
- while (n--) ary.push(Math.random());
- return ary.sort(Array.NUMERIC | Array.RETURNINDEXEDARRAY);
- }
- // 產生 0-9999 不重複亂數陣列
- var ra:Array = genRandomArray(10000);
- trace(ra[0]); // 取出第一個不重複亂數
- trace(ra[1]); // 取出第二個不重複亂數
20110130 補充
後來仔細測試過,以上程式碼很少但不是最快的
但是需要稍微修改一下,不能用 Math.floor 那會降低速度
- // 產生 0 到 (n - 1) 不重複亂數陣列
- function genRandomArray(n:int):Array {
- var ary:Array = [];
- var i:int, r:int, t:int;
- for (i = 0 ; i < n ; ++i) {
- ary[i] = i;
- }
- for (i = 0 ; i < n ; ++i) {
- r = int(Math.random() * n);
- t = ary[r];
- ary[r] = ary[i];
- ary[i] = t;
- }
- return ary;
- }
- // 產生 0-99999 不重複亂數陣列
- var ra:Array = genRandomArray(100000);
- trace(ra[0]); // 取出第一個不重複亂數
- trace(ra[1]); // 取出第二個不重複亂數
留言
張貼留言