我正在寻找一种最快的方法来挑选具有特定条件的随机对象(来自数组)。
在下面的例子中,我有一个多维数组,50 * 50包含对象。我想从该数组中选择一个随机对象,但该对象的大小必须大于100。
while (object.size <= 100)
{
attempts++;
object = grid_array[Math.round(Math.random() * 49)][Math.round(Math.random() * 49)];
}
目前我已对此进行了测试,在某些情况下,它需要超过300次尝试。有更优雅的方式吗?
谢谢,
答案 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)
我询问您是否需要索引,因为您可以使用RegExps
和JSON
类(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;
}