一個簡單的方法根據權重,按照比例隨機顯示對應的廣告,
權重值越大,概率越大。
比如有個廣告list,廣告屬性有id,weight,寫個通用方法來根據權重顯示廣告id:
public
class
TEST {
public
static
void
main(String[] args) {
List<Ad> list =
new
ArrayList<Ad>();
list.add(
new
Ad(
1
,
5
));
list.add(
new
Ad(
2
,
10
));
list.add(
new
Ad(
3
,
20
));
list.add(
new
Ad(
4
,
30
));
list.add(
new
Ad(
5
,
35
));
ComTest com =
new
ComTest();
Collections.sort(list,com);
int
id1=
0
;
int
id2=
0
;
int
id3=
0
;
int
id4=
0
;
int
id5=
0
;
for
(
int
i =
0
; i <
100
; i++) {
int
id = getAd(list);
if
(id==
1
) id1++;
if
(id==
2
) id2++;
if
(id==
3
) id3++;
if
(id==
4
) id4++;
if
(id==
5
) id5++;
}
//
System.out.println(
"12345:"
+id1+
"|"
+id2+
"|"
+id3+
"|"
+id4+
"|"
+id5);
//統計各id出現的次數
}
public
static
int
getAd(List<Ad> list){
int
sumWeight =
0
;
for
(Ad ad :list){
sumWeight+=ad.getWeight();
}
Random rand =
new
Random();
int
x = rand.nextInt(sumWeight) +
1
;
int
start =
0
;
int
end =
0
;
for
(
int
i=
1
;i<list.size();i++){
if
(i==
1
){
start = list.get(i-
1
).getWeight();
end = list.get(i-
1
).getWeight()+list.get(i).getWeight();
}
else
{
start = end;
end = start+list.get(i).getWeight();
}
if
(x>start && x<=end){
return
list.get(i).getId();
}
else
if
(x<=start){
return
list.get(i-
1
).getId();
}
else
{
continue
;
}
}
return
0
;
}
}
class
Ad{
public
Ad(
int
id,
int
weight){
this
.id = id;
this
.weight = weight;
}
int
id;
int
weight;
public
int
getId() {
return
id;
}
public
void
setId(
int
id) {
this
.id = id;
}
public
int
getWeight() {
return
weight;
}
public
void
setWeight(
int
weight) {
this
.weight = weight;
}
}