为了账号安全,请及时绑定邮箱和手机立即绑定

PHP:如何随机选择最大概率值?

PHP:如何随机选择最大概率值?

PHP
慕姐8265434 2022-11-04 16:41:31
我有以下数组和代码    $a = [      149 => 55,      130 => 10,      131 => 5,      132 => 5,      133 => 10,      134 => 10,      135 => 5    ];   $rand = rand (0,(count($a)-1));   echo array_values($a)[$rand];这将主要给出结果,5,10而不是55.总价值是 100% 的概率。值可以是十进制的,也可以是 55.55、10.10 等,但总体上将是 100%我已经关注了https://www.geeksforgeeks.org/how-to-get-random-value-out-of-an-array-in-php/但这并没有像预期的那样给出完美的结果。所以应该主要随机选择哪个概率最高。所以结果可能是这样的:55、55、10、10、10、55、5等。我发现了一些有用的链接Generate random results by weight in PHP? 其中概率 = 权重
查看完整描述

4 回答

?
慕尼黑8549860

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

            }

        }

   }


查看完整回答
反对 回复 2022-11-04
?
喵喔喔

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]然后从随机获取结果,然后在还原数组的值中再次随机获取


查看完整回答
反对 回复 2022-11-04
?
跃然一笑

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;

}


查看完整回答
反对 回复 2022-11-04
?
慕容708150

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

}


查看完整回答
反对 回复 2022-11-04
  • 4 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信