【问题标题】:Randomly SELECTing rows based on certain criteria根据特定条件随机选择行
【发布时间】:2015-07-03 08:12:49
【问题描述】:

我正在为办公室构建一个媒体播放器,到目前为止一切都很好,但我想添加一个投票系统(有点像 Pandora 竖起大拇指/竖起大拇指)

为了构建播放列表,我目前正在使用以下代码,它会随机抽取 100 个最近未播放过的曲目(我们确保所有曲目的播放次数大致相同),然后确保我们听不到10 首歌曲中的同一艺术家,并构建了一个包含 50 首歌曲的播放列表。

max_value = Items.select(fn.Max(Items.count_play)).scalar()

    query = (Items
             .select()
             .where(Items.count_play < max_value, Items.count_skip_vote < 5)
             .order_by(fn.Rand()).limit(100))


    if query.count < 1:
            max_value = max_value - 1
            query = (Items
             .select()
             .where(Items.count_play < max_value, Items.count_skip_vote < 5)
             .order_by(fn.Rand()).limit(100))


    artistList = []
    playList = []
    for item in query:
            if len(playList) is 50:
                    break

            if item.artist not in artistList:
                    playList.append(item.path)

            if len(artistList) < 10:
                    artistList.append(item.artist)
            else:
                    artistList.pop(0)
                    artistList.append(item.artist)

    for path in playList:
            client.add(path.replace("/music/Library/",""))

我正在尝试找出使用赞成/反对票的最佳方式。 我希望看到更少的反对票和更多的赞成票。

我不追求直接代码,因为我对 python 很满意,更多的是我无法完全理解的逻辑(也就是说,如果你觉得需要改进我的代码,我会的不要阻止你:))

【问题讨论】:

    标签: python random-sample


    【解决方案1】:

    最初给每个轨道一个权重 w,例如10 - 投票增加这个,down 减少它(但永远不会到 0)。然后在决定接下来播放哪个曲目时: 计算所有权重的总和,生成一个介于 0 和这个总和之间的随机数,然后逐步遍历 0-49 的轨道,将它们的 w 相加,直到超过随机数。播放该曲目。

    确切的加权算法(例如,赞成/反对改变多少 w)当然会影响曲目(重新)出现的频率。是不是苹果不得不改变他们早期 iPod 的“随机”随机播放,因为它可以随机播放相同的曲目两次(或足够靠近用户注意到)所以他们不得不减少随机播放,我猜还意味着通过最近播放曲目的时间来更改权重 - 在这种情况下,在选择下一首曲目时也将考虑自上次播放以来的时间。确保涵盖最终情况,即每个人都对 49 首(如果他们想要静音,则全部投下 50 首)曲目进行投票。或者也许这就是你想要的......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多