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--;
}