Reputation: 467
You can get a random element from an array like below
var list:Array=[1,2,3,4,5];
var randomElement:int = list[ int(Math.random()*list.length) ] ;
But how to get a random element from an object?
var list:Object={a:0,b:1,c:1};
var randomElement:int = //from the list..how??
Thanks
Upvotes: 0
Views: 865
Reputation: 2280
What about this approach?
var list:Object = {a:0,b:1,c:1};
var keyCount:int = 3; //number of keys
var randomElement:String;
var randProb:Number = 1.0 / keyCount;
for (randomElement in list)
{
if (Math.random() < randProb)
{
break;
}
else
{
randProb += 1.0 / keyCount;
}
}
trace(list[randomElement]);
Upvotes: 0
Reputation: 42166
One more alternative ( for this special case ):
var list:Object={ a:0,b:1,c:2 };
var max_i:Number = "c".charCodeAt( 0 );
var min_i:Number = "a".charCodeAt( 0 );
var range:Number = max_i - min_i ;
var rand_i:Number = Math.floor( Math.random() * ( range + 1 ) );
var prop:String = String.fromCharCode( min_i + rand_i );
var randomElement:int = list[ prop ];
trace( prop , randomElement );
Upvotes: 1
Reputation: 5267
You can create temporary array of keys for example:
var list:Object={a:0,b:1,c:2};
var keys:Array = [];
for(var key:String in list)
keys[keys.length] = key;
var randomElement:int = list[keys[ int(Math.random()*keys.length) ]];
It's quite expensive to create new array each time you need a random property of an object, but I don't see other options to get it.
Upvotes: 2