欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[转] AS3 快速產生不重覆亂數

程序员文章站 2022-05-08 18:05:24
...
[url]http://bbs.9ria.com/viewthread.php?tid=71711&extra=page%3D1%26amp;orderby%3Ddateline%26amp;filter%3D86400[/url]

看到奶綠文章 FlashAS3 亂數不重復的方法
剛好最近有複習到 AS3 Array 平常少用的 function
所以也來思考怎樣更有效率的產生不重覆亂數

AS3 的 Array 假如單純只有用 Array.NUMERIC 模式排序速度是夠快的
可是一旦用了自定的排序 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 排序慢一些


// 產生 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 而已

// 產生 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]); // 取出第二個不重複亂數
相关标签: PHP BBS