亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 212 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號