AS3在某些条件下从数组中选取随机对象

时间:2016-01-04 13:33:57

标签: arrays actionscript-3

我正在寻找一种最快的方法来挑选具有特定条件的随机对象(来自数组)。

在下面的例子中,我有一个多维数组,50 * 50包含对象。我想从该数组中选择一个随机对象,但该对象的大小必须大于100。

while (object.size <= 100)
{
    attempts++;
    object = grid_array[Math.round(Math.random() * 49)][Math.round(Math.random() * 49)];
}

目前我已对此进行了测试,在某些情况下,它需要超过300次尝试。有更优雅的方式吗?

谢谢,

2 个答案:

答案 0 :(得分:2)

我要做的是首先过滤源数组以仅提取有效候选者,然后返回一个随机数(如果有的话)。

例如:

function getRandomObject(grid_array:Array, minSize:Number):Object {
    var filtered:Array = [];
    for(var i:int = 0; i < grid_array.length; i++){
        var inner:Array = grid_array[i];
        for(var ii:int = 0; ii < inner.length; ii++){
            var object:Object = inner[ii];
            if(object.size >= minSize){
                filtered.push(object);
            }
        }
    }
    return filtered.length ? filtered[int(Math.random() * filtered.length)] : null;
}

// example:
var object:Object = getRandomObject(grid_array, 100);
if(object){
    // do stuff with `object`
}

答案 1 :(得分:1)

我询问您是否需要索引,因为您可以使用RegExpsJSON类(Flash Player 11)执行此操作。在这个例子中,我存储了对象的索引:

创建随机多维数组以测试函数

//---I stored a variable size and the indexes inside the Object
//---Size variable will be numbers between 0 and 500
var array:Array = [];

var i;
var j;
var size:uint = 50;
var obj:Object;

for(i = 0; i < size; i++){

    array[i] = [];

    for(j = 0; j < size; j++){

        obj = new Object();
        obj.size = Math.floor(Math.random() * 500);
        obj.files = i;
        obj.columns = j;

        array[i][j] = obj;      

    }

}

获取size属性大于100的随机Object的方法

//---I'll use to search the object a JSON string
var str:String = JSON.stringify(array);

//---Function to get the random Object
function getRandom():Object{

    //---RegExp to search object with size between 100 and 500
    var reg:RegExp = /\{[^\}]*"size":(?:10[1-9]|1[1-9]\d|[2-5]\d\d)[^\}]*\}/g;

    //---Get all matches
    var matches:Array = str.match(reg);

    //---Return a random match converted to object
    //---If no match founded the return will be null
    return matches ? JSON.parse( matches[Math.floor(Math.random() * matches.length)] ) : null;

}