2011-01-24 10 views
0

バナー広告システムを開発中です。各バナーはdbに格納されます。各バナーにはワイト(int番号)があります。それをどのように効率的に変換できますか?バナー広告アルゴリズム

EXの場合

banner_1 70 banner_2 90 banner_3 150

と私は、バナー1は、これが呼ばれた22% 秒29% 第三の48%

+1

どのようにあなたが、あなたの22%、29%、48%を見つけましたか? – tibur

+0

これらのワイト値は時間とともに変化しますか、新しいバナーを追加しますか? –

答えて

1

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; 
    } 
} 
2

表示したい(サプライズ) "加重乱数"を使用します。 this questionの最上位の答えがあなたを助けます。

3

重みがw[1]w[2]、...、w[n]ある場合には、i番目のバナー広告があることのための割合p[i]

p[i] = w[i]/sum(w) 

、で割った特定の広告の重量であり、重みの総和あなたのデータベースシステムは、それをかなり簡単に計算できるはずです。

広告が比較的少なく、更新よりも多くの広告が表示される場合は、広告ごとにこのp[i]をキャッシュし、広告の追加、削除、修正を行うたびに再計算する価値があります。

0
Banner1 = (70/(70 + 90 + 150)) * 100 s 
Banner2 = (90/(70 + 90 + 150)) * 100 s 
Banner3 = (150/(70 + 90 + 150)) * 100 s 

ええと、単純なweighted averageロジックです。

0

重量から百分率への変換が必要な場合は、実際には簡単です。すべての重量を合計し、合計で100を掛け合わせて合計する必要があります。これはO(n)です。保存された重みを持つSQLデータベースを使用して、あなたと仮定すると、あなたは合計重量を返し、calcuationsのためにそれを使用することができます

0

あなたのパーセンテージは最大99になるので、いくつかの小数点以下を切り捨てたと思います。

あなたはこの方程式を解く、(100パーセントを見つけるために)すべての重みを合計しなければならないxのバナーの割合を検索するには:float percent = weight_x/sum of weights

関連する問題