2017-04-23 9 views

答えて

1

あなたができることを確認:私はこのように、ランダムに1を取得したいです。

// Object or Array. Which every you prefer. 
var item = { 
    bike:40, // Weighted Probability 
    care:30, // Weighted Probability 
    boat:15, // Weighted Probability 
    train:10, // Weighted Probability 
    plane:5 // Weighted Probability 
    // The number is not really percentage. You could put whatever number you want. 
    // Any number less than 1 will never occur 
}; 

function get(input) { 
    var array = []; // Just Checking... 
    for(var item in input) { 
     if (input.hasOwnProperty(item)) { // Safety 
      for(var i=0; i<input[item]; i++) { 
       array.push(item); 
      } 
     } 
    } 
    // Probability Fun 
    return array[Math.floor(Math.random() * array.length)]; 
} 

console.log(get(item)); // See Console. 
+0

これは小規模な整数(これは私のユースケースでした)でも合理的にうまく動作しますが、重みの合計と等しい長さであれば、数が多いほど巨大/低速になる可能性があります。また、非整数​​の場合は機能しませんので、整数になるには最小の共通分母を見つける必要があります(非常に正確な重みに対しては不可能かもしれません)。 – mattsoave

0

ワイルドカード取扱いといくつかのES6のアプローチ、::ここでそれを行うには、簡単なコードです

const randomizer = (values) => { 
let i, pickedValue, 
     randomNr = Math.random(), 
     threshold = 0; 

for (i = 0; i < values.length; i++) { 
    if (values[i].probability === '*') { 
     continue; 
    } 

    threshold += values[i].probability; 
    if (threshold > randomNr) { 
      pickedValue = values[i].value; 
      break; 
    } 

    if (!pickedValue) { 
     //nothing found based on probability value, so pick element marked with wildcard 
     pickedValue = values.filter((value) => value.probability === '*'); 
    } 
} 

return pickedValue; 

}

使用例:

let testValues = [{ 
    value : 'aaa', 
    probability: 0.1 
}, 
{ 
    value : 'bbb', 
    probability: 0.3 
}, 
{ 
    value : 'ccc', 
    probability: '*' 
}] 

randomizer(testValues); // will return "aaa" in 10% calls, 
//"bbb" in 30% calls, and "ccc" in 60% calls; 
関連する問題