Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.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 - Fatal编程技术网

Php 如何编写基于元素中存储的概率%返回元素子集的函数?

Php 如何编写基于元素中存储的概率%返回元素子集的函数?,php,Php,我有以下数组 $arr = array( "person1" => 10, "person2" => 10, "person3" => 20, "person4" => 25, "person5" => 35, ); 我想写一个函数,它以$arr为参数,根据每个元素中存储的值返回数组的3个元素 例如,如果返回的子集产生 $newArr = array( "person5" =&

我有以下数组

$arr = array(
    "person1" => 10,
    "person2" => 10,
    "person3" => 20,
    "person4" => 25,
    "person5" => 35,                    
);
我想写一个函数,它以
$arr
为参数,根据每个元素中存储的值返回数组的3个元素

例如,如果返回的子集产生

$newArr = array(
    "person5" => 35,  
    "person1" => 10,
    "person4" => 25,                  
);
根据存储在
$arr['person5']
中的值除以存储在其余元素中的值之和,person5有35%的几率成为存储在
$newArr
中的第一个元素。
$arr['person5']/($arr['person5']+$arr['person4']+$arr['person3']+$arr['person2']+$arr['person1'])

根据存储在
$arr['person1']
中的值除以存储在其余元素中的值之和,person1成为存储在
$newArr
中的第二个元素的可能性约为15%。
$arr['person1']/($arr['person4']+$arr['person3']+$arr['person2']+$arr['person1'])

根据存储在
$arr['person4']
中的值除以存储在其余元素中的值之和,person4成为存储在
$newArr
中的第二个元素的可能性约为45%。
$arr['person4']/($arr['person4']+$arr['person3']+$arr['person2'])


我如何编写一个函数来实现这一点?

您正在寻找轮盘赌轮选择算法,请参阅:

$count=3;
$arr=数组(
“人1”=>10,
“人2”=>10,
“人3”=>20,
“人4”=>25,
“人5”=>35,
);
$result=array();
//从低到高排序
asort($arr);
//循环3次(基于计数)
而($count>0){
//得到所有人的总数
$sum=0;
foreach($arr作为$rank){
$sum+=$rank;
}
//获取一个介于0和sum之间的随机值
$delta=rand(0$sum);
$current=0;
//继续循环每个项目,增加排名直到$sum超过delta
//将每个项目视为包含部分切片的人员。值越大,被选择的更改越大
$current=0;
foreach($arr as$name=>$rank){
$current+=$rank;

如果($delta您正在寻找轮盘赌轮选择算法,请参阅:

$count=3;
$arr=数组(
“人1”=>10,
“人2”=>10,
“人3”=>20,
“人4”=>25,
“人5”=>35,
);
$result=array();
//从低到高排序
asort($arr);
//循环3次(基于计数)
而($count>0){
//得到所有人的总数
$sum=0;
foreach($arr作为$rank){
$sum+=$rank;
}
//获取一个介于0和sum之间的随机值
$delta=rand(0$sum);
$current=0;
//继续循环每个项目,增加排名直到$sum超过delta
//将每个项目视为包含部分切片的人员。值越大,被选择的更改越大
$current=0;
foreach($arr as$name=>$rank){
$current+=$rank;

如果($delta抱歉,这不起作用,
echo“”。打印($result,true)“
添加到脚本末尾会导致每次都打印相同的内容。我没有测试代码。我鼓励您下次在投票前先解释/寻求帮助。理论仍然是您需要的。我现在就修复示例代码。@LedZeppelin-查看更新的代码。我测试了它,这很有效。欢迎:)感谢您的帮助,包括
asort($arr)
的目的是什么?您不需要对每次迭代的所有剩余值求和。只需减去删除的值。很抱歉,这不起作用,
echo'。打印($result,true)“
添加到脚本末尾会导致每次都打印相同的内容。我没有测试代码。我鼓励您下次在投票前先解释/寻求帮助。理论仍然是您需要的。我现在就修复示例代码。@LedZeppelin-查看更新的代码。我测试了它,这很有效。欢迎:)感谢您的帮助,包含
asort($arr)
的目的是什么?您不需要对每次迭代的所有剩余值求和。只需减去删除的值即可。
$count = 3;
$arr = array(
    "person1" => 10,
    "person2" => 10,
    "person3" => 20,
    "person4" => 25,
    "person5" => 35,                    
);

$result = array();

// sort from low to high
asort($arr);

// loop 3 times (based on count)
while ($count > 0){

    // get the sum of all persons
    $sum = 0;
    foreach ($arr as $rank){
        $sum += $rank;
    }

    // get a random value between 0 and sum
    $delta = rand(0, $sum);
    $current = 0;

    // keep looping over each item, increasing rank untill $sum has surpassed delta
    // see each item as as person containing a portion of the slice. The bigger the value, the greater the change of being selected
    $current = 0;
    foreach ($arr as $name => $rank){
        $current += $rank;

        if ($delta <= $current){
            $result[$name] = $rank;
            break;
        }
    }

    unset($arr[$name]);

    $count--;
}