sql - 具有不同权重的随机项目的无限滚动算法(显示给用户的概率)
问题描述
我有一个网络/移动应用程序,它应该显示一个无限滚动视图(项目列表的延续以动态方式定期加载),其中每个项目都有一个重量,与重量相比,重量越大其他项目的权重越高,应该是加载项目并将其显示在用户列表中的机会/概率,项目应该随机加载,只是项目在列表中的机会应该不同。
我正在寻找一种有效的算法/解决方案或至少可以帮助我实现这一目标的提示。
值得一提的几点:
- 权重有这些边界:0 <= w < 无限。
- 重量不是静态值,它可以根据某些项目属性随时间变化。
- 每个权重高于 0 的项目都应该有机会向用户显示,即使权重明显低于其他项目的权重。
- 当用户滚动并执行多个 API 请求时,他/她不应该看到重复的项目,或者至少机会应该很低。
- 我使用 SQL 数据库 (PostgreSQL) 来存储项目,因此该解决方案对于这种类型的数据库应该是有效的。(它不应该是一个纯粹的 SQL 解决方案)
希望我没有错过任何重要的事情。如果我这样做了,请告诉我。
解决方案
以下是实施该解决方案的一些想法:
数据库表应该有一个列,其中每个条目都是一个生成的数字,如下所示:
- 对数(R)/W,
其中——</p>
- W 是记录的权重大于 0(它本身就是它自己的列),并且
- R 是 (0, 1) 中的每个记录的均匀随机数
(另见 Arratia, R.,“关于统一随机整数的素数分解中的依赖量”,2002 年)。然后在需要时获取该列中具有最高值的记录。
但是请注意,SQL 没有生成随机数的标准方法;实现 SQL 的 DBMS 有自己的方法(例如RANDOM()
PostgreSQL),但它们的工作方式取决于 DBMS(例如,比较 MySQLRAND()
和 T-SQL NEWID()
)。
推荐阅读
- react-native - Amplify GraphQL 订阅不响应事件
- netlogo - 如何修复 netlogo 6.1.1 无名?已定义
- postgresql - 如果存在多个索引,Postgres 如何选择使用哪个索引?
- flutter - Flutter,设置多个堆栈的屏幕
- javascript - 如何在javascript中附加默认下拉选项值
- .htaccess - 通过 .htaccess 文件将 .png 图像重定向到另一个 .png 图像
- php - woocommerce 转换器时间戳 $orderdate = $order->order_date;
- java - 如何在 spark kafka 流中创建消费者组并将消费者分配给消费者组
- ruby - 如何在两个大浮点值相乘后得到正常值,从而导致 ruby 语言中的指数值?
- powershell - 如何将 Start-Job -ArgumentList 转换为正确的值