根据重量和选取的时间选择随机密钥

时间:2017-01-01 11:48:10

标签: algorithm random

我正在设计一个广告系统,根据广告的重量(出价)在广告之间随机轮播。

local ads = local ads = {
    ["a"] = {
        views = 0,
        bid = 10
    },
    ["b"] = {
        views = 0,
        bid = 1000
    },
    ["c"] = {
        views = 0,
        bid = 100
    },
    ["d"] = {
        views = 0,
        bid = 50
    },
    ["e"] = {
        views = 0,
        bid = 500
    },
    ["f"] = {
        views = 0,
        bid = 10
    },
}

我四处搜索并找到了以下算法:

  
      
  1. 获取所有加权数字的总和
  2.   
  3. 选择0和总和之间的随机数
  4.   
  5. 循环表(广告)和if(随机数)< = weight然后返回ad else random number =随机数 - weight
  6.   

使用该算法并循环1,000次打印

a 3
c 60
b 581
e 313
d 35
f 8

这很好。但是正如你所看到的那样,即使权重(竞标)相同,广告f也几乎获得了3倍的观看次数。

我还尝试通过考虑广告已经获得的观点来使算法更公平。我通过减少每个视图的重量来做到这一点。

我无法让它工作,我想知道是否有人可以帮助我?

1 个答案:

答案 0 :(得分:0)

如果你想确保每个人都能获得恰到好处的比例,你可以使用这个算法 - 它需要大量的内存:

  • 使用10 a,1000 b,100 c ...
  • 填充大小为sum的数组
  • 随机播放阵列
  • 从0
  • 开始依次从数组中选择项目

当您用完元素时,您可以使用相同的数组重新开始或重新创建数组。无论如何,每当权重发生变化时,您都需要重新创建数组。