我正在开发横幅广告系统。每个横幅都将存储在数据库中。每个横幅都有一个wight(int数字)。如何有效地改变百分比?
例如:
banner_1 70 banner_2 90 banner_3 150
我希望横幅1显示22% 第二个29% 第三个48%
答案 0 :(得分:3)
如果权重为w[1]
,w[2]
,...,w[n]
,那么第i个横幅广告的p[i]
百分比为:
p[i] = w[i] / sum(w)
即,给定广告的权重除以权重的总和。您的数据库系统应该能够相当容易地计算出来。
如果您的广告相对较少,并且广告获得的视图数量多于更新次数,则可能需要为每个广告缓存此p[i]
,然后在添加,删除或修改广告的权重时重新计算广告。
答案 1 :(得分:2)
这被称为(惊讶)“加权随机数”。 this question的最佳答案可以帮助您。
答案 2 :(得分:1)
假设您使用存储了权重的SQL数据库,您可以返回总权重并将其用于计算:
SELECT BannerId, BannerUrl, BannerWeight, SUM(BannerWeight) as TotalWeight FROM Banners;
然后使用类似的东西来找到一个值:
public int GetRandomRow(Row[] rows)
{
int TotalWeight = 3;
int rnd = Random(rows[0].TotalWeight);
for (int row=0; row < rows.Count; row++)
{
if (rnd < rows[row])
return row;
}
}
答案 3 :(得分:0)
Banner1 = (70 / (70 + 90 + 150)) * 100 s
Banner2 = (90 / (70 + 90 + 150)) * 100 s
Banner3 = (150 / (70 + 90 + 150)) * 100 s
是的,这是一个简单的weighted average逻辑。
答案 4 :(得分:0)
如果您只需要权重转换百分比,那就非常简单:您需要对所有权重求和,然后对于每个权重,您将其除以总和并乘以100.它是O(n)。
答案 5 :(得分:0)
拳头关闭,你的百分比加起来达到99,所以我猜你已经四舍五入了。
要查找横幅x的百分比,您必须总结所有权重(找到100%),求解此等式:float percent = weight_x / sum of weights