2017-04-03 104 views
4

有沒有基於百分比提取數值的方法?基於百分比的數值概率

值概率:
不好:1%
正常:29%
好:70%

var move ["bad","normal","good"]; 

一個簡單的條件語句:

if (move == "bad") { 
bad_move = "That's a bad move!"; 
} else if (move == "normal") { 
normal_move = "Classic move!"; 
} else { 
good_move = "Amazing move!"; 
} 

然後,就是PHP這種問題比Javascript好?

+0

什麼是與其餘的失蹤概率100%? –

+0

*「對於這種問題,PHP比Javascript好嗎?」* - 如果有人禁用JS,則JS解決方案很糟糕。答:使用兩種方法;在任何情況下,serverside都不會讓你失望。 –

+0

剛剛編輯百分比,我的錯誤。他們仍然是開放的,因爲我還沒有找到一個好的解決方案。我會選擇最接近的一個。 @ Fred-ii- – Mlabuit

回答

1

你可以寫一個函數,樣本值與給定的概率百分比:

function weightedSample(pairs) { 
 
    const n = Math.random() * 100; 
 
    const match = pairs.find(({value, probability}) => n <= probability); 
 
    return match ? match.value : last(pairs).value; 
 
} 
 

 
function last(array) { 
 
    return array[array.length - 1]; 
 
} 
 

 
const result = weightedSample([ 
 
    {value: 'Bad', probability: 1}, 
 
    {value: 'Normal', probability: 29}, 
 
    {value: 'Good', probability: 70} 
 
]); 
 

 
console.log(result);

我不能說,如果PHP會更好。這種問題在PHP中不應該更多/更少。你應該使用哪個(JS或PHP)真的取決於該函數是否應該在服務器或客戶端上運行。

0

我建議使用連續檢查的概率和隨機數的其餘部分。

該函數首先將返回值設置爲最後一個可能的索引並迭代,直到隨機值的其餘部分小於實際概率。

概率必須總和爲1。

function getRandomIndexByProbability(probabilities) { 
 
    var r = Math.random(), 
 
     index = probabilities.length - 1; 
 

 
    probabilities.some(function (probability, i) { 
 
     if (r < probability) { 
 
      index = i; 
 
      return true; 
 
     } 
 
     r -= probability; 
 
    }); 
 
    return index; 
 
} 
 

 
var i, 
 
    move = ["bad", "normal", "good"], 
 
    probabilities = [0.01, 0.29, 0.7], 
 
    count = {}, 
 
    index; 
 

 
move.forEach(function (a) { count[a] = 0; }); 
 

 
for (i = 0; i < 1e6; i++) { 
 
    index = getRandomIndexByProbability(probabilities); 
 
    count[move[index]]++; 
 
} 
 

 
console.log(count);
.as-console-wrapper { max-height: 100% !important; top: 0; }