搜尋

首頁  >  問答  >  主體

php - 機率演算法排序

根據機率對資料進行排序,如何讓每個機率區間都有結果?

舉例如下,假設有一組資料如下

{
a: 40,
b: 20,
c: 10,
d: 5,
e: 5,
f: 5,
g: 5,
h: 5,
i: 3,
j: 2
}

key為要排序的值,value為每個值出現在數組該位置的機率,例如a,出現在數組0位置的機率為40%,也就是算出來的數組中,a有40%的機會展示在數組的第一位,然後剩下的依次根據機率進行演算法排序。

我目前的解決方法(Low的辦法,而且不能隨著數組的擴大而繼續支持):
1、根據現有的機率進行區間劃分,假設a的區間為0-40,b為40-60,c為60-70,以此類推
2、利用函數獲得1-100區間的隨機數,然後將結果進行丟彈(也就是放在對應的區間中)

程式碼如下(求優化想法)

public function getRandValue($rate, $max, $min, $arr)
    {
        while (count($rate)) {
            $rand = $this->getRand($min, $max);

            if (0 < $rand && $rand <= 40) {
                $num = 40;
            } else if (40 < $rand && $rand <= 60) {
                $num = 20;
            } else if (60 < $rand && $rand <= 70) {
                $num = 10;
            } else if (70 < $rand && $rand <= 75) {
                $num = 5;
            } else if (75 < $rand && $rand <= 80) {
                $num = 5;
            } else if (80 < $rand && $rand <= 85) {
                $num = 5;
            } else if (85 < $rand && $rand <= 90) {
                $num = 5;
            } else if (90 < $rand && $rand <= 95) {
                $num = 5;
            } else if (95 < $rand && $rand <= 98) {
                $num = 3;
            } else if (98 < $rand && $rand <= 100) {
                $num = 2;
            }

            if (!in_array($num, $arr) && in_array($num, array(40, 20, 10, 3, 2))) {
                $arr[] = $num;
            } elseif (!in_array($num, array(40, 20, 10, 3, 2))) {
                $arr[] = $num;
            }

            if (count($arr) >= 10) {
                break;
            }
        }


        return $arr;
    }

遇到的問題:(in_array判斷是有因為這幾個區間的值只能算出來一次)
1、算出來的值不一定每個區間的值都有
2、程式碼沒有可擴展性

還望大家指點指點,請指教,感謝各位!

过去多啦不再A梦过去多啦不再A梦2744 天前754

全部回覆(2)我來回復

  • 黄舟

    黄舟2017-05-24 11:35:58

    我覺得這個問題有問題,這樣的輸入甚至不能保證滿足條件的分佈是存在的。

    {a: 60, b: 40} 为例:全排列的空间是{ab, ba}。那麼根據你的定義應該有:

    a出现在位置0的概率为60%,所以 P(ab) = 0.6
    
    且
    
    b出现在位置1的概率为40%,所以 P(ab) = 0.4

    回覆
    0
  • 我想大声告诉你

    我想大声告诉你2017-05-24 11:35:58

    跟我寫的一個樣 = = 我也想知道怎麼擴充

    回覆
    0
  • 取消回覆