【发布时间】:2019-02-04 10:29:34
【问题描述】:
我的问题是:
- 如何展示随机广告,使相同的广告不会再次出现。
- 如何重视具有较高信用价值的广告。
Sql Server 数据库表
AdId AdName AdUrl Credits
1 Ad1 abc.com 10
2 Ad2 def.com 40
3 Ad3 fgi.com 30
4 Ad4 xyz.com 10
上面的 ads 表可能包含 1000 条记录。我想一次展示 10 个广告(通过重视具有更高价值的信用)。
我的方法
- 我目前正在做的是从广告表中随机选择 10 个广告并显示它们。
- 还在广告表中添加了一个标志 IsAdDisplayed(布尔值),这样同一个随机广告就不会重复(直到它显示所有广告)
- 当我完成所有广告的展示后,我将 IsAdDisplayed 再次更新为 false。
LINQ
var result = (from u in idb.ads
select u).OrderBy(x => Guid.NewGuid()).Take(10);
但这不会考虑更高的学分。
这是正确的方法吗?如何展示随机广告(考虑信用)以及相同的广告不会重复展示?
【问题讨论】:
-
我不会随机选择并设置布尔标志,而是将列表打乱,然后遍历打乱的列表。
-
无论学分对第一次随机排序有什么影响:如果有 1000 条记录,则在至少 100 次查询后会再次出现价值更高的广告。
-
我会使用 HashSet 或独特的容器
-
这样的事情只有在您有一个用户的情况下才有效,否则您需要有关当前用户看过哪些广告的信息。您无需更新数据库,但拥有 cookie 并请求广告,不包括那些标记为已插入当前 cookie 的广告。
-
按“信用”对广告进行排序,信用最高的广告在顶部,然后在位置 0 到长度为 1 处随机选择一个广告。当您选择一个广告时,只需将其从列表中删除,这样就无法再次选择它。这是一个棘手的问题,你如何使你的随机数更有可能出现在列表的开头?有多种选择随机数 1 - N 的方法,这样更容易出现较小的数字。
标签: c# sql-server asp.net-mvc linq razor