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

本文介绍了一种使用ActionScript 3 (AS3)高效生成不重复随机数数组的方法,通过不同技巧优化了随机数生成的速度,并对比了几种实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[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]); // 取出第二個不重複亂數
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值