【问题标题】:Getting random value from a SQLite table从 SQLite 表中获取随机值
【发布时间】:2012-04-21 12:35:13
【问题描述】:

我目前正在开发一个 Android 应用程序,我正在尝试从如下所示的数据库表中获取随机值:

| ID | Score|
| 1  | 20   |
| 2  | 5    |
| 5  | 5    |
| 6  | 5    |
| 14 | 15   |

(假设这些是表中唯一的值)

我想从这个表中获取一个随机值,其中 ID 1 40% 的时间,ID 2 10% 的时间,ID 5 10% 的时间等等...
如果有可能,你会怎么做?

【问题讨论】:

  • 为什么不使用哈希表而不是 SQLite?数据需要持久化吗?
  • 另外,如果这些是数据库中唯一的值.. 并且 ID 1 = 40% , {2,5,6,14} = 10% .. 其他 20% 会发生什么时间?这个问题需要进一步解释。
  • @Aidanc:我认为 Score 实际上是一个“相对”计数器,所以它们的总和都是 100。所以 14 实际上是 30%,因为值是 15。但我只是在这里猜测...
  • 此数据是歌曲 ID 列表(其中一些将更频繁地播放)

标签: java android sqlite


【解决方案1】:

给定一个List<Integer>add()每首歌曲索引score次、Collections.shuffle()的列表,依次播放。为了获得更好的结果,请跳过连续重复。更多here

【讨论】:

    【解决方案2】:

    任何已知数据库都不支持随机选择。如果您进行一些搜索,您可能会发现如下内容:

    select * from my_table order by rand();
    

    但是当它试图对整个表进行排序时,效率非常低。

    如果您的数据集不是太大,您可以简单地将整个表拉入一个数组中,然后从该数组中随机选择。

    现在进行选择,这更棘手。

    一个更简单的版本会是这样的:

    1. 获取表中所有 id (id) 和权重 (weight) 的列表。
    2. 遍历列表并计算每个 id 的累积权重cwieght
    3. 当您到达列表末尾时,您将获得所有权重的总和。在 0 和总数之间选择一个随机数 r
    4. 再次浏览列表,找到r >= cweight && r < cweight+weight 所在的项目,如果你是游戏,可以使用二进制印章搜索。

    这里也有othersmarter approaches,这取决于某些限制。

    【讨论】:

      猜你喜欢
      • 2017-08-13
      • 1970-01-01
      • 2015-03-30
      • 2017-04-26
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多