2017-04-03 125 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; }