Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 固定比例选择_Php_Algorithm_Math_Probability - Fatal编程技术网

Php 固定比例选择

Php 固定比例选择,php,algorithm,math,probability,Php,Algorithm,Math,Probability,我有一组元素,我需要从中选择任何一个元素。每个元素都与一个百分比机会相关联。百分比加起来是100 我需要从这些元素中选择一个,这样一个元素被选择的几率等于百分比值。因此,如果一个元素有25%的几率,那么它应该有25%的几率被选中。换句话说,如果我们选择元素1百万次,那么该元素应该选择接近25万次。我想我写它比你向我们展示你迄今为止所做的更快 也许不是最好的解决方案,但就目前而言,这似乎是你唯一的解决方案 给你: $elements = array( 'This' => 25,

我有一组元素,我需要从中选择任何一个元素。每个元素都与一个百分比机会相关联。百分比加起来是100


我需要从这些元素中选择一个,这样一个元素被选择的几率等于百分比值。因此,如果一个元素有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;
      }