2012-08-24 22 views
3

例如,我有以陣列3組的元件:設定元素的發生的機率在陣列

public function randomTile():Number 

{ 

var tiles:Array = new Array(fire,ice,water); 

var index:Number=Math.floor(Math.random()*tiles.length); 

return tiles[index]; 

} 

如何設置火(70%)的發生,冰(10%)的機會,和水(20%)?

回答

1

這應該任意數量的元素的工作,你可以指定任何機會價值。

var tiles:Array = [ 
    {"item":"fire", "chance":70 }, 
    {"item":"ice", "chance":10 }, 
    {"item":"water","chance":20} 
]; 

var picked:Object = pickRandomByChance(tiles); 
trace(picked.item); 

public function pickRandomByChance(options:Array):Object 
{ 
    var copy:Array = []; 
    var range:Number = 0; 
    for (var i:int = 0; i < options.length; i++) 
    { 
    copy.push({ "item":options[i].item, "chance":options[i].chance }); 
    range += copy[i].chance; 
    if (i > 0) 
     copy[i].chance += copy[i - 1].chance; 
    } 

    var pick:Number = Math.floor(Math.random() * range); 

    for (i = 0; i < copy.length; i++) 
    { 
    if (pick <= copy[i].chance) 
     return copy[i]; 
    } 
    return null; 
} 
+0

這不會總是返回'火'或null,因爲循環總是首先檢查'火',而10和20在<= 70範圍內? –

+0

你是對的我修改了答案。 –

+0

trace(picked.item)訪問undefined屬性「pick」時發生錯誤。如何擺脫這一點? – Mirage01

1

有很多方法可以做到這一點,它很大程度上取決於您的項目範圍。如果你只是有三個要素,使用switch語句很容易:

var rand:Number = Math.random(); 
switch(true){ 
    case rand >= .3: 
     //use fire 
     break; 

    case rand >= .1 
     //use water 
     break; 

    default: 
     //use ice 
} 

其他人可能有更好的方法,雖然