如果谁能帮我解出这道算法,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分相送.

解决方案 »

  1.   

    生成一个临时表
    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()
      

  2.   

    to:Mirricle(Miracle Supply) ( ) 信誉:100 
    -----------------------------谢谢您的回答,不过好象算法不优, 另外能不能实现也还是个问题.你说:"然后生成一个随机数 用这个随机数当条件 取这个表的大于这个随机数的第一行的ID"生成的随机数, 必须按权值大小来决定它出现的资料大小. 权值越大,该值出现几率要越大.
      

  3.   

    Select Top 1 AD3.ID, AD3.Title From
     (
         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
      

  4.   

    我这个是Access,如果MSSQL的话,大概把 Rnd 换成 Rand 就可以了吧
      

  5.   

    to:Mirricle(Miracle Supply) ( ) 信誉:100 
    -------------
    你的解释很对. 通过解释,我也想通了. 可是你的那个方法会不会有些浪费呢?主要我还觉得好象有些浪费.
      

  6.   

    int allcount = 100;//一百条广告,从数据库中取广告count(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
      

  7.   

    int allcount = 100;//一百条广告,从数据库中取广告count(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
      

  8.   

    Select Top 1 AD3.ID, AD3.Title From
     (
         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次
      

  9.   

    sprc_lcl(cool一生)  自己写的,逻辑上没问题,可行。吃饭去了...参考下吧
      

  10.   

    to:sprc_lcl(cool一生) ( ) 信誉:100 
    ----------------------
    int guolvitem = 0; //过滤过的item和
    while(allcount>=0)
    {
    if((sumitems-guolvitem-thisAD)<items[allcount])
    {
    thistitle = alltitle[allcount];
    break;
    }
    guolvitem += items[allcount];
    allcount = allcount -1;
    }
    -------------------------
    唉,我还没明白这是怎么算的.晕.
      

  11.   

    to:Mirricle(Miracle Supply) ( ) 信誉:100 
    ---------------------------
    谢谢, 你的答案解决了. 给80分,其它两个人也出了些力,一人给10分吧.不好意思啊. 因为我采用了Mirricle(Miracle Supply) ( )的方法,所以给最多的分数:80分.
      

  12.   

    对不起啊,我刚才看错了.我说的方法在给分时看到是tiaoci(我挑刺,我快乐) ( )先给出的.因为Mirricle(Miracle Supply) ( )说他也有了这个方法,所以我给了20分,
    tiaoci(我挑刺,我快乐) 70分.
      

  13.   

    2  "abc"
    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内语句
      

  14.   

    唉,其实这个方法Mirricle(Miracle Supply) 是肯定想到了的.才给20分,多少有些可惜. 可是我都已经给出去了.以后有机会多些. 我会记住你的ID的.
      

  15.   

    SET NOCOUNT ON
    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
      

  16.   

    把RandonRate当作数轴上的区间长度,连在一起形成一个大区间
    在这个大区间内的随机数落在哪个小区间内的概率和该区间的长度有关那这个区间的长度就是 RandomRate=========================可惜来晚了,都揭帖了~
      

  17.   

    上面这个有点问题…………SET NOCOUNT ON
    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
      

  18.   

    把RandonRate当作数轴上的区间长度,连在一起形成一个大区间
    在这个大区间内的随机数落在哪个小区间内的概率和该区间的长度有关
                                                  理由永远是谎言,信仰永远是自慰
    非常认同!我也是这么想的!