Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不重复地显示随机行

不重复地显示随机行
EN

Stack Overflow用户
提问于 2019-02-04 02:29:34
回答 3查看 95关注 0票数 0

我的问题是:

  1. 如何显示随机广告,所以相同的广告不会再次出现。
  2. 如何重视信用价值较高的广告。

Sql Server DB表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AdId AdName AdUrl     Credits
 1    Ad1    abc.com   10
 2    Ad2    def.com   40
 3    Ad3    fgi.com   30
 4    Ad4    xyz.com   10

以上广告表可能包含1000条记录。我想一次展示10个广告(通过重视具有更高价值的学分)。

My Approach

  1. 我目前正在做的是从ads表中选择10个随机广告并显示它们。
  2. 还在ads表中添加了一个标志IsAdDisplayed (布尔值),以便相同的随机广告不会重复(直到它显示所有的广告)。
  3. 当我看完所有的广告后,我再次将IsAdDisplayed更新为false。

LINQ

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var result = (from u in idb.ads
      select u).OrderBy(x => Guid.NewGuid()).Take(10);

但这不会考虑到更高的信用额度。

这是正确的做法吗?如何显示随机广告(考虑学分)和相同的广告不会重复显示?

EN

回答 3

Stack Overflow用户

发布于 2019-02-04 02:43:44

尝试以下几个方面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication100
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("AdId", typeof(int));
            dt.Columns.Add("AdName", typeof(string));
            dt.Columns.Add("AdUrl", typeof(string));
            dt.Columns.Add("Credits", typeof (int));
            dt.Rows.Add(new object[] {1, "Ad1", "abc.com", 10});
            dt.Rows.Add(new object[] {2, "Ad2", "def.com", 40});
            dt.Rows.Add(new object[] {3, "Ad3", "fgi.com", 30});
            dt.Rows.Add(new object[] {4, "Ad4", "xyz.com", 40});

            Random rand = new Random();
            List<DataRow> randomRows = dt.AsEnumerable().Select(x => new { row = x, rand = rand.Next() }).OrderBy(x => x.rand).Select(x => x.row).ToList();
            DataTable dt2 = randomRows.CopyToDataTable();

        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2019-02-04 02:50:52

如何显示随机广告(考虑学分)和相同的广告不会重复显示?

如果您想要优先考虑学分,可以尝试编写类似以下内容的查询(可能需要将其转换为LINQ)。

在这里,有更多的信用记录将获得更多的优先权。与credit > 80一样,credit < 40将获得最高优先级,而credit < 40将获得最少的优先级。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT TOP 10 * 
FROM   (SELECT * 
        FROM   (SELECT TOP 80 * 
                FROM   [table] 
                WHERE  credit > 80 
                ORDER  BY Newid())A 
        UNION ALL 
        SELECT * 
        FROM   (SELECT TOP 60 * 
                FROM   [table] 
                WHERE  credit <= 80 
                       AND credit > 60 
                ORDER  BY Newid())B 
        UNION ALL 
        SELECT * 
        FROM   (SELECT TOP 40 * 
                FROM   [table] 
                WHERE  credit <= 60 
                       AND credit > 40 
                ORDER  BY Newid())C 
        UNION ALL 
        SELECT * 
        FROM   (SELECT TOP 20 * 
                FROM   [table] 
                WHERE  credit <= 40 
                ORDER  BY Newid())D) T 
ORDER  BY Newid() 
票数 0
EN

Stack Overflow用户

发布于 2019-02-04 05:33:39

你写道:

重视有更高价值的信用

这是否意味着,只要你有信用额为40的未显示广告,你就根本不想显示带有信用10的广告?或者你的意思是说,你想给更高学分的广告更多的机会被展示。如果是这样的话:如果学分高出4倍,那么被展示的机会应该大4倍吗?

让我们假设你不想显示低学分的广告,只要你有高学分的未显示广告。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int nrOfAdsToSelect = ...;
var selectedAds = dbContext.Adds
    .Where(ad => !ad.IsSelected)
    .OrderyDescending(ad => ad.Credit)
    .Take(nrOfAddsToSelect);

然而,如果你想给所有的广告一个展示的机会,只有有更高学分的广告才有更高的机会,你应该考虑有多高的机会。

最简单的方法是将信用转换成一系列整数,指示何时选择广告:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Id Credit  => Range
00    01      00
01    01      01
02    02      02, 03                                    // credit 2: 2 numbers
03    03      04, 05, 06                                // credit 3: 3 numbers
04    10      07, 08, 09, 10, 11, 12, 13, 14, 15, 16    // 10 numbers

选取范围为00,16的随机数。选择Id 04的概率比选择Id 01的概率高10倍。

因此,您需要一个函数来从Creditand一个StartNumber创建一个整数范围。这可以像上面一样简单,也可以是任何其他算法,这取决于你对获得更高学分的广告的几率有多高。

您可以使用您的信用范围函数来转换不显示的添加到整数序列的序列。

作为推广职能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static IEnumerable<int> ToRange(this int credit, int startNumber)
{
     // example: Credit 40 is 40 times more chance than credit 1.
     // so range length is equal to credit
     return Enumerable.Range(startNumber, credit);
}

static IEnumerable<int> ToRange(this IEnumerable<Ad> adds)
{
    int startNumber = 0;
    foreach (Ad add in adds)
    {
        // only use ads that are not displayed yet to select a new Ad.
        if (!ad.IsDisplayed)
        {
             var range = add.Credit.ToRange();
             foreach (var value in range) yield return value;
        }
    }
}

用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Ad> ads = ...
var range = ads.ToRange().ToList();
int selectedIndex = rnd.Next(range.Count);
var firstSelectedAdd = ads[selectedIndex];

问题是,一旦你选择了第一个广告,你的第二个广告的机会就会改变。您需要创建一个新的范围:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static Ad Select(this IReadOnlyList<Ad> ads)
{
    var range = ads.ToRange().ToList();
    int selectedIndex = rnd.Next(range.Count);
    return ads[selectedIndex];
}

static IEnumerable<Ad> SelectAds(this IEnumerable<Ad> ads, int selectCount)
{
    for (int i=0; i<selectCount; ++i)
    {
        var selectedAd = ads.Select();
        yield return selectedAd;
        selectedAd.IsDisplayed = true; // to make sure it is not selected again
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54514228

复制
相关文章
【Python 练习】随机显示不重复的单
【题目:】创建能以随机顺序显示一组单词的程序。要求该程序能打印出所有单词,但不能重复!
py3study
2020/01/09
9860
MySQL实战第十七讲-如何正确地显示随机消息?
我在上一篇文章,为你讲解完 order by 语句的几种执行模式后,就想到了之前一个做英语学习 App 的朋友碰到过的一个性能问题。今天这篇文章,我就从这个性能问题说起,和你说说 MySQL 中的另外一种排序需求,希望能够加深你对 MySQL 排序逻辑的理解。
越陌度阡
2022/05/06
4680
MySQL实战第十七讲-如何正确地显示随机消息?
python 去除重复行
from pandas import read_csv; df = read_csv('D://PA//4.3//data.csv') newDF = df.drop_duplicates();
py3study
2020/01/08
3.1K0
Linux删除重复行
第一,用sort+uniq,注意,单纯uniq是不行的。 sort -n test.txt | uniq
阳光岛主
2019/02/19
11.7K0
MySQL深入学习第十七篇-如何正确地显示随机消息?
我在上一篇文章,为你讲解完 order by 语句的几种执行模式后,就想到了之前一个做英语学习 App 的朋友碰到过的一个性能问题。今天这篇文章,我就从这个性能问题说起,和你说说 MySQL 中的另外一种排序需求,希望能够加深你对 MySQL 排序逻辑的理解。
越陌度阡
2020/11/26
5690
MySQL深入学习第十七篇-如何正确地显示随机消息?
生成无重复随机数
1 /** 2 * 无重复随机字符串 3 * num<62 num>=62或不传时位默认的62位 4 * @param {[int]} num [随机字符串长度] 5 * @return {[string]} [返回随机字符串] 6 */ 7 var ranNum = function(num) { 8 9 var str =
ProsperLee
2018/10/24
1.6K0
MySQL | 查找删除重复行
本文讲述如何查找数据库里重复的行。这是初学者十分普遍遇到的问题。方法也很简单。这个问题还可以有其他演变,例如,如何查找“两字段重复的行”(#mysql IRC 频道问到的问题)
逍遥子大表哥
2021/12/17
5.8K0
MySQL | 查找删除重复行
PHP随机显示图片代码
新建一个目录,文件名叫img.把图片以1,2,3,4,5的命名规则放入目录中,就行了~
爱游博客
2019/08/07
4.6K0
随机日志:两列显示
  看到别人的随机日志都是现实两列,我这一直显示一列,一是因为显示一列不好看,二是提供的信息量太低。因此改成两列还是很有必要的,于是自己写了些css样式,添加到主题的style.css文件的最下面。
the5fire
2019/02/28
9710
是的,股价不遵循随机游走!
《非随机漫步华尔街》是由Lo和MacKinlay撰写的一本在学术上具有挑战性的教科书:
量化投资与机器学习微信公众号
2019/11/12
2.1K0
是的,股价不遵循随机游走!
Linux文件随机抽取N行
有时候需要从大文件中随机抽取N行出来进行模拟,但是用python或者别的语言感觉不太方便,linux下直接分割感觉会更快捷。一般可以考虑以下的方法:
生信编程日常
2020/05/26
8.8K0
sql去掉重复的行_select去掉重复记录
如果是这种情况的话用distinct是过滤不了的,这就要用到主键id的唯一性特点及group by分组
全栈程序员站长
2022/11/11
2.9K0
MySQL 如何查找删除重复行?
第一步是定义什么样的行才是重复行。多数情况下很简单:它们某一列具有相同的值。本文采用这一定义,或许你对“重复”的定义比这复杂,你需要对sql做些修改。本文要用到的数据样本:
Bug开发工程师
2020/03/12
6.6K0
MySQL 如何查找删除重复行?
[日常] Go语言圣经-查找重复行
2.map存储了键/值(key/value)的集合,对集合元素,提供常数时间的存、取操作,map[string]int ==> key的类型string和value的类型int
唯一Chat
2019/09/10
1.1K0
MySQL 如何查找删除重复行?
第一步是定义什么样的行才是重复行。多数情况下很简单:它们某一列具有相同的值。本文采用这一定义,或许你对“重复”的定义比这复杂,你需要对sql做些修改。本文要用到的数据样本:
芋道源码
2019/10/22
5.6K0
zblogphp随机显示文章的教程
最近几次上架新主题的时候都被驳回了,原因是zblog博客已经全面禁止利有“rand()”函数进行提取,不让使用“rand()”原因就是:“rand()”不支持mysql以外的数据库,在数据库数据比较多的情况下速度会变得很慢。
李洋博客
2021/06/15
6160
HIVE 查询显示列名 及 行转列显示
set hive.cli.print.header=true; // 打印列名 set hive.cli.print.row.to.vertical=true; // 开启行转列功能, 前提必须开启打印列名功能 set hive.cli.print.row.to.vertical.num=1; // 设置每行显示的列数
小小工匠
2021/08/16
1.6K0
Artalk 无评论随机显示诗词
在本博客现阶段如果没有换主题或评论系统,随便找一篇没有评论的文章都可以看到实际效果。
eallion
2023/10/18
2810
Artalk 无评论随机显示诗词
如何生成不重复的随机数
要想获取不重复的随机数,我们需要一点小技巧。例如,想要获取21个不重复的随机数,可以先将21个数字按顺序排序,然后再从中选择所需的数字,这样可以避免出现任何重复数。
fanjy
2023/09/28
6110
如何生成不重复的随机数
Linux 删除文本中的重复行
这里我做了个简单的测试,当file中的重复行不再一起的时候,uniq将服务删除所有的重复行。经过排序后,所有相同的行都在相邻,因此unqi可以正常删除重复行。
阳光岛主
2019/02/19
8.6K0

相似问题

如何使用javascript不重复地显示随机图像

20

Laravel分页显示重复和替换随机行

21

Python不重复地从文件中打印随机行

60

不重复地访问数据库中的随机行

10

显示随机,但不重复,直到结束不工作

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文