簡體   English   中英

如何根據其值隨機返回關聯數組名稱

[英]How to randomly return associative array names based on its values

我有一組與許多“要點”相對應的廣告系列。 看起來像這樣:

[ {"c1":4, "c2":8, "c3":25} ]

我想從這個集合中隨機選擇一個廣告系列。 我假設rand()將在某個時候發揮作用。 但是,我希望每個人的價值都能影響其被選中的機會。

因此,例如,選擇廣告系列“ c2”的頻率應該是選擇廣告系列“ c1”的頻率的兩倍(大約)。 “ c3”將是王者,最有可能被選中。

每次腳本運行時,活動的數量和相應的值可以相同或不同。

有什么好的方法可以解決這個問題?

這很容易。 只需為每個廣告系列創建另一個具有CDF值的地圖即可。 對於您的示例將是:

0.108: C1
0.324: C2
1: C3

然后獲取介於0和1之間的隨機數。遍歷該圖,找到比該隨機數大的最小數(您可以對它進行二進制搜索,也可以創建一個排序的哈希圖,該哈希圖也可以給出最小的大數)

請注意,通過添加概率,最后一項可能不會加到1(可以是0.999)。 只需手動將其設置為1。

這是為您解決此問題的功能。 它會創建一個加權數組,您可以將其與一個隨機數一起使用,以根據其加權值正確加權每個項目。

var campaigns = {"c1":4, "c2":8, "c3":24};

function getWeightedRandomCampaign(list) {
    var weighting = [];
    var total = 0;
    for (var item in list) {
        weighting.push({key: item, value: list[item]});
        total += list[item];
    }
    // generate random number between 1 and total
    var rand = Math.floor(Math.random() * total);
    // figure out which weighted slot it fits in
    var cum = 0;
    for (var i = 0; i < weighting.length; i++) {
        cum += weighting[i].value;
        if (rand < cum) {
            return(weighting[i].key);
        }            
    }
    return(weighting[weighting.length - 1]);
}

您可以在這里看到它的工作: http : //jsfiddle.net/jfriend00/ffwqQ/


運作方式如下。

它從廣告系列對象和權重值開始。

var campaigns = {"c1":4, "c2":8, "c3":24};

然后,它構建一個臨時數據結構,如下所示:

var weighting = [{key: "c1", value: 4}, {key: "c2", value: 8}, {key: "c3", value: 24}];

在創建該數據結構時,它會跟蹤所有權重值的總計。

然后,它創建一個介於0和該總數之間的隨機數。

然后,它遍歷加權數組,將這些值加起來以找到超過隨機數的第一個累積值。 找到該位置后,即為選定的插槽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM