一.应用场景:
有时我们需要从一些列数据中根据权重随机选取指定条数记录出来,这里需要权重、随机,我们根据权重越大的,出现概率越大。例如广告系统:可根据客户支付金额大小来调控客户们的广告出现概率,客户支付金额越大,其广告出现频率越频繁,例如:加入有10条广告,然后每条广告都有一个权重,我们每次要根据权重选取5条广告出来进行显示。有了需求,我们就进行解决,本文章就是利用一种简单的算法来实现根据权重来随机选取。
二.简单算法的实现:
根据我们需求,上网找了不少资料,都没有找到一种比较适合的方案,就自己想了一个简单的实现方案,试了一下,效果还挺不错的,现在和大家分享分享,有不合理或者错误之处,还望各位高手纠正。废话少说,其实算法很简单,如下:
- 每个广告都有一个权重,用W表示。我们假设最小的权重为1,数字越大的权重越高。
- 计算出所有广告的权重总和,用SUM表示。
- 遍历每个广告,将它的权重W与从0到(SUM-1)的一个随机数(即权重总和SUM以内的随机数)相加,得到新的权重排序值,用S表示。
- 根据广告权重排序值S从大到小进行排序。
- 根据排序结果选取最前面的几条记录就是我们所需要的结果。
其简单原理如下:
1.假如我们有A、B、C、D四个广告,其权重分别为1、2、3、4,则其总权重SUM=1+2+3+4=10。
2.根据其权重值与一个小于SUM的随机值(由于SUM=10,则随机值范围是0~9)相加,得到一个权重排序值,如下:
广告
权重值
最小权重排序值
最大权重排序值
A
1
1+0=1
1+9=10
B
2
2+0=2
2+9=11
C
3
3+0=3
3+9=12
D
4
4+0=4
4+9=13
3.由此可以得出A、B、C、D的范围,由上面可以看出A是1~10之间的数,而D的范围是4~13,由此可以看出,D得出随机数大的概率比较大。所以我们只要根据其出现概率再排一下顺序,再选取排在权重排序值比较大的前几项即可,这就可以得到我们所需要的根据权重选取概率的广告。
三.C#代码算法的实现:
1.首先我们先声明一个权重基础类RandomObject,以后只要继承该类即可。其代码如下: