2017-01-01 57 views
1

我正在设计一个广告系统,根据广告的重量(投标)在广告之间随机轮换。根据体重和挑选时间挑选随机密钥

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. 选0之间的随机数,并通过表格总结
  3. 环路(广告)并且如果(随机数)< =重量然后返回其他随机数=随机数 - 重量

使用算法和循环1000次打印出

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

这是非常好的。但是,正如你所看到的,即使在同等重量的情况下,广告f的收看次数几乎是广告的3倍。

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

虽然我不能让它工作,我不知道有人能帮助我吗?

+1

您应该期望结果不均匀,特别是对于低值。运行它1000000,事情可能会出来。 –

+4

为什么'python'标签? –

+0

@SQLHacks是正确的。基于统计数字理论,较低的数字更容易受到随机数发生器的影响。尝试寻找一个加密随机生成器,这是如果你想它真的是随机的。如果你做这样的事情真的很高的数字,你仍然会得到歪斜的数据。 –

回答

0

如果你想确保每个人都得到正是你可以使用这个算法权比例 - 它需要大量的记忆:

  • 填充大小sum的阵列10,1000 B,100 ç...
  • 洗牌阵列随机
  • 皮克项目从序列中的阵列,从0

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