如果谁能帮我解出这道算法,100分相赠.假设数据库中有100条广告. 每条广告的随机率是不一样的且每条广告的随机率都存储在sql数据库中.
现在我要在这100条广告中取出10条广告到页面上去显示.
如何根据随机率,当每次刷新页面时, 这10条广告会根据随机数进行随机改变? sql数据表的部分内容如下:
ID(主键) RandomRate(随机率) Title(广告标题)
------------------------------------------------------------
1 10 aa
2 14 bb
3 76 cc
4 45 dd
5 87 ff
其余省略,但假设该表有100条广告数据.现在要根据表中的"随机率", 当 前台页面 每次页面刷新时, 从这100条广告中,根据广告随机率(权值)取出变化的10条广告.权值 越大, 则该条广告在前台页面显示的概率越大.
谁帮我想出这个算法,我100分相送.
现在我要在这100条广告中取出10条广告到页面上去显示.
如何根据随机率,当每次刷新页面时, 这10条广告会根据随机数进行随机改变? sql数据表的部分内容如下:
ID(主键) RandomRate(随机率) Title(广告标题)
------------------------------------------------------------
1 10 aa
2 14 bb
3 76 cc
4 45 dd
5 87 ff
其余省略,但假设该表有100条广告数据.现在要根据表中的"随机率", 当 前台页面 每次页面刷新时, 从这100条广告中,根据广告随机率(权值)取出变化的10条广告.权值 越大, 则该条广告在前台页面显示的概率越大.
谁帮我想出这个算法,我100分相送.
1 10 aa
2 14 bb
3 76 cc
4 45 dd
5 87 ffID=1插10行
ID=2插14行
...
ID=5插87行然后从临时表中select top 1 ... order by newid()
-----------------------------谢谢您的回答,不过好象算法不优, 另外能不能实现也还是个问题.你说:"然后生成一个随机数 用这个随机数当条件 取这个表的大于这个随机数的第一行的ID"生成的随机数, 必须按权值大小来决定它出现的资料大小. 权值越大,该值出现几率要越大.
(
Select AD1.ID As ID, AD1.Title As Title, Sum(AD2.RandomRate) As RandomRate
From ADV As AD1, ADV As AD2
Where AD2.ID <= AD1.ID Group By AD1.ID, AD1.Title
) As AD3
Where AD3.RandomRate >= Rnd() * (Select Sum(RandomRate) From ADV)
Order By ID
-------------
你的解释很对. 通过解释,我也想通了. 可是你的那个方法会不会有些浪费呢?主要我还觉得好象有些浪费.
int[] items = new int[allcount]; //将一百条广告的概率值放入这个数组,从数据库中取RandomRate
string[] alltitle = new string[allcount];//将全部titleint sumitems = 10000;//从数据库中sum(RandomRate)System.Random a = new Random();
int thisAD = a.Next(sumitems);//从全值中取消一随机数;string thistitle = ""; //要取的title
int guolvitem = 0; //过滤过的item和
while(allcount>=0)
{
if((sumitems-guolvitem-thisAD)<items[allcount])
{
thistitle = alltitle[allcount];
break;
}
guolvitem += items[allcount];
allcount = allcount -1;
}
//thistitle就是取的title....可换成ID
int[] items = new int[allcount]; //将一百条广告的概率值放入这个数组,从数据库中取RandomRate
string[] alltitle = new string[allcount];//将全部titleint sumitems = 10000;//从数据库中sum(RandomRate)System.Random a = new Random();
int thisAD = a.Next(sumitems);//从全值中取消一随机数;string thistitle = ""; //要取的title
int guolvitem = 0; //过滤过的item和
while(allcount>=0)
{
if((sumitems-guolvitem-thisAD)<items[allcount])
{
thistitle = alltitle[allcount];
break;
}
guolvitem += items[allcount];
allcount = allcount -1;
}
//thistitle就是取的title....可换成ID
(
Select AD1.ID As ID, AD1.Title As Title, Sum(AD2.RandomRate) As RandomRate
From ADV As AD1, ADV As AD2
Where AD2.ID <= AD1.ID Group By AD1.ID, AD1.Title
) As AD3
Where AD3.RandomRate >= Rnd() * (Select Sum(RandomRate) From ADV)
Order By ID这个好像就是我第二种想法
不过考虑了一下不太可行
TOP1 没问题,但是取10个实际上是运行这东西10次
----------------------
int guolvitem = 0; //过滤过的item和
while(allcount>=0)
{
if((sumitems-guolvitem-thisAD)<items[allcount])
{
thistitle = alltitle[allcount];
break;
}
guolvitem += items[allcount];
allcount = allcount -1;
}
-------------------------
唉,我还没明白这是怎么算的.晕.
---------------------------
谢谢, 你的答案解决了. 给80分,其它两个人也出了些力,一人给10分吧.不好意思啊. 因为我采用了Mirricle(Miracle Supply) ( )的方法,所以给最多的分数:80分.
tiaoci(我挑刺,我快乐) 70分.
3 "bcd"
5 "cde"如上表,只有三行,简单的说解释如下..int allcount = 3;
int[] items = {2,3,5};
string[] alltitle = {"abc","bcd","cde"};
int sumitems = 10;//取1到10的一个随机数
int thisAD = ?;while(allcount>0)
{
if((sumitems-guolvitem-thisAD)<items[allcount-1])
//当allcount = 3时,如果thisad >5 <=10 则取第三个,跳出环;否则继续:allcount=2,guolvitem=5,如果thisad> 2 <=10-5 则取第2个,否则续:allcount=1,guolvitem=5+3=8,如果thisad>0 <10-8,OK
{
thistitle = alltitle[allcount-1];
break;
}
guolvitem += items[allcount-1];
allcount = allcount -1;
}//程序写的有误,sorry.参照上面的while内语句
CREATE TABLE TT (
[ID] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
[RandomRate] INT NOT NULL,
[Title] VARCHAR(20) NOT NULL
)
GOINSERT INTO TT (RandomRate,Title) VALUES (10,'aa');
INSERT INTO TT (RandomRate,Title) VALUES (14,'bb');
INSERT INTO TT (RandomRate,Title) VALUES (76,'cc');
INSERT INTO TT (RandomRate,Title) VALUES (45,'dd');
INSERT INTO TT (RandomRate,Title) VALUES (87,'ee');
GODECLARE @TRR INT
DECLARE @IND INT
SELECT @TRR=SUM(RandomRate) FROM TT
SET @IND=RAND()*@TRR+1SELECT TOP 1 * FROM (
SELECT [ID],[Title],(SELECT SUM(RandomRate) FROM TT AS t0 WHERE t0.[ID]<=t1.[ID]) AS [Trr]
FROM tt AS T1
) AS Tmp
WHERE Tmp.Trr<@IND ORDER BY Trr DESCGODROP TABLE TT
GO
在这个大区间内的随机数落在哪个小区间内的概率和该区间的长度有关那这个区间的长度就是 RandomRate=========================可惜来晚了,都揭帖了~
CREATE TABLE TT (
[ID] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
[RandomRate] INT NOT NULL,
[Title] VARCHAR(20) NOT NULL
)
GOINSERT INTO TT (RandomRate,Title) VALUES (10,'aa');
INSERT INTO TT (RandomRate,Title) VALUES (14,'bb');
INSERT INTO TT (RandomRate,Title) VALUES (76,'cc');
INSERT INTO TT (RandomRate,Title) VALUES (45,'dd');
INSERT INTO TT (RandomRate,Title) VALUES (87,'ee');
GODECLARE @TRR INT
DECLARE @IND INT
SELECT @TRR=SUM(RandomRate) FROM TT
SET @IND=RAND()*@TRR+1SELECT TOP 1 * FROM (
SELECT [ID],[Title],[RandomRate],(SELECT SUM(RandomRate) FROM TT AS t0 WHERE t0.[ID]<=t1.[ID]) AS [Trr]
FROM tt AS T1
) AS Tmp
WHERE Tmp.Trr-@IND>=0 AND Tmp.Trr-@IND<=Tmp.RandomRate ORDER BY Trr DESCSELECT @TRR AS TRR,@IND AS IND
GODROP TABLE TT
GO
在这个大区间内的随机数落在哪个小区间内的概率和该区间的长度有关
理由永远是谎言,信仰永远是自慰
非常认同!我也是这么想的!