Php 固定比例选择
我有一组元素,我需要从中选择任何一个元素。每个元素都与一个百分比机会相关联。百分比加起来是100Php 固定比例选择,php,algorithm,math,probability,Php,Algorithm,Math,Probability,我有一组元素,我需要从中选择任何一个元素。每个元素都与一个百分比机会相关联。百分比加起来是100 我需要从这些元素中选择一个,这样一个元素被选择的几率等于百分比值。因此,如果一个元素有25%的几率,那么它应该有25%的几率被选中。换句话说,如果我们选择元素1百万次,那么该元素应该选择接近25万次。我想我写它比你向我们展示你迄今为止所做的更快 也许不是最好的解决方案,但就目前而言,这似乎是你唯一的解决方案 给你: $elements = array( 'This' => 25,
我需要从这些元素中选择一个,这样一个元素被选择的几率等于百分比值。因此,如果一个元素有25%的几率,那么它应该有25%的几率被选中。换句话说,如果我们选择元素1百万次,那么该元素应该选择接近25万次。我想我写它比你向我们展示你迄今为止所做的更快 也许不是最好的解决方案,但就目前而言,这似乎是你唯一的解决方案 给你:
$elements = array(
'This' => 25,
'is' => 15,
'a' => 15,
'crappy' => 20,
'list' => 25
);
asort($elements);
$elements = array_reverse($elements);
// Precalc cumulative value
$cumulant = 0;
foreach ($elements as $key => &$value) {
$cumulant += $value;
$value = $cumulant;
}
function pickAnElement($elements) {
$random = rand(1, 100);
foreach ($elements as $key => $value) {
if ($random <= $value) {
return $key;
}
}
}
$picks = array();
for ($i = 0; $i < 10000; $i++) {
$element = pickAnElement($elements);
if (!array_key_exists($element, $picks)) {
$picks[$element] = 0;
}
$picks[$element]++;
}
var_dump($picks);
$elements=数组(
'此'=>25,
'is'=>15,
“a”=>15,
“蹩脚”=>20,
'列表'=>25
);
asort($要素);
$elements=array\u reverse($elements);
//信用证前累积值
$累积量=0;
foreach($key=>&$value形式的元素){
$cumulant+=$value;
$值=$累积量;
}
函数pickaneElement($elements){
$random=兰特(1100);
foreach($key=>$value形式的元素){
如果($random你描述的是一个多项式过程
它们产生这种随机过程的方法如下:
(我将使用伪代码,但将其转换为真实代码应该很容易。)
按概率的相反顺序对“框”进行排序:
(不需要,只是优化)
例如,您有值=[0.45,0.3,0.15,0.1]
然后创建“累积”分布,这是所有元素的总和,索引向我们展示了您迄今为止的尝试。我确实根据原始数据计算了概率。(通过对每个元素总和的百分比进行求和和计算)我不知道如何从这里开始。该死。让我来玩玩它:)+1为了扩展我的知识:)-今后我将更经常地使用累积量这个词。感谢您澄清了排序的目的,这是非常有意义的。此外,我想对于高通量应用程序,将累积量与原始数据保存在内存中是有意义的,这样我们就不会每次都在计算累积量了里。
cumulant=[0,0,0,0] // initiate it
s=0
for j=0 to size()-1 {
s=s+values[i] ;
cumulant[i]=s
}
for j=0 to size()-1 {
if !(cumulant[i]<){
print "your index is ",i
break;
}