4 回答
TA贡献1818条经验 获得超11个赞
这是一个类似于 GA 中轮盘选择的实现。EReload 的答案版本,但以总和而不是 100 为界。
$a = [
149 => 55,
130 => 10,
131 => 5,
132 => 5,
133 => 10,
134 => 10,
135 => 5
];
echo randSelect($a);
function randSelect($a) {
$values = array_values($a);
$sum = array_sum($values);
$rand = (rand(0,1000)/1000) * $sum;
$partialSum = 0;
for ($i=0; $i < count($values); $i++) {
$partialSum += $values[$i];
if($partialSum >= $rand){
return $values[$i];
// incase you are using something like array_count_values and are actually looking for the keys
// return array_keys($a)[$i];
}
}
}
TA贡献1735条经验 获得超5个赞
据我了解,无论您的数组中出现多少次较小的数字,您都希望在 rand 方法中更频繁地出现更大的数字。您首先需要独特的阵列。
权重随机是一种简单的随机方法,但是您可以通过求和权而不是自身来更自由地控制权重。
$a = [
149 => 55,
130 => 10,
131 => 5,
132 => 5,
133 => 10,
134 => 10,
135 => 5
];
$val_arr = array_unique(array_values($a));
function rand_by_sum($arr, $power=1){
$sum = 0;
$f_val = function($f)use($power){
return pow($f, $power);
};
foreach($arr as $f){
$sum += $f_val($f);
}
$rand = mt_rand(0, $sum);
$tmp_sum = 0;
foreach($arr as $f){
$tmp_sum += $f_val($f);
if($tmp_sum >= $rand) return $f;
}
}
for($i=0; $i< 10; $i++){
echo rand_by_sum($val_arr, $argv[1]) . " ";
}
echo "\n";
这里有一些不同 pow 的测试结果
php test.php 0.5
55 5 10 55 5 55 55 5 55 55
php test.php 2
55 55 10 55 55 55 55 55 55 55
php test.php 1
55 10 55 55 55 55 55 55 55 10
要获取值,您可以还原数组,55 => [149]然后从随机获取结果,然后在还原数组的值中再次随机获取
TA贡献1826条经验 获得超6个赞
我认为你实际上可以打乱数组并弹出一个元素,再次打乱并弹出元素,这将是随机的,那些概率更大的数字将首先出现。
您可以做的是创建另一个包含 100 个数字的数组,表示总概率,并在其中插入与其值相等的数字数量,最后您将其打乱以稍后随机选择一个索引。然后你会得到一个包含 100 个数字的数组,其中重复次数最多的数字是最有可能的。最后,您只需要选择一个随机索引并创建您的数组。
你能告诉我你是在寻找这样的东西还是我误解了这个问题
function getProb($array, $elements)
{
$myNewArray = [];
$myProbabilisticArray = $this->getProbabilisticArray($array);
for ($i=0; $i < $elements; $i++) {
$myNewArray[] = $myProbabilisticArray[array_rand($myProbabilisticArray)];
}
return $myNewArray;
}
function getProbabilisticArray($array) {
$myNewArray = [];
rsort($array);
$currentProbability = 0;
$accumulatedProbability = $array[0];
$currentPosition = 0;
while ($currentProbability < 100) {
if ($currentProbability > $accumulatedProbability) {
$currentPosition++;
$accumulatedProbability += $array[$currentPosition];
}
array_push($myNewArray, $array[$currentPosition]);
$currentProbability++;
}
shuffle($myNewArray);
return $myNewArray;
}
TA贡献1831条经验 获得超4个赞
现在,你的数组是这样的: -
55, 10, 5, 5, 10, 10, 5
现在,您应该生成一个介于 [0, 100) 之间的随机数,我们称之为r
。
现在,如果
r
介于 [0, 55) 之间,请选择值 55。否则,如果
r
介于 [55, 55 + 10 = 65) 之间,则选择值 10。否则,如果
r
介于 [65, 65 + 5 = 70) 之间,则选择值 5。否则,如果
r
介于 [70, 70 + 5 = 75) 之间,则选择值 5。否则,如果
r
介于 [75, 75 + 10 = 85) 之间,则选择值 10。否则,如果
r
介于 [85, 85 + 10 = 95) 之间,则选择值 10。否则,如果
r
介于 [95, 95 + 5 = 100) 之间,则选择值 5。
我相信你会明白的......
所以,对于一般情况,如果你有一个名为“arr”的数组,这是伪代码: -
function SELECTPROB()
{
$r = generateRandomNumber(0, 100); //function to generate random number between 0 and 100, (100 exclusive)
$sum = 0;
foreach($arr as $i)
{
if($r >= $sum && $r < $sum + $i)
{
return $i
}
$sum = $sum + $i
}
return -1 //Should technically never reach upto this, but it can if your probability's sum is not 100
}
- 4 回答
- 0 关注
- 134 浏览
添加回答
举报