根据特定条件随机选择行

时间:2015-07-03 08:12:50

标签: python random-sample

我正在为办公室建立一个媒体播放器,到目前为止还不错,但我想添加一个投票系统(有点像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/",""))

我正在努力找出使用上/下投票的最佳方式。 我希望通过upvotes看到更少的内线投票。

我不是在直接代码之后,因为我对python非常好,更多的是我不能完全理解的逻辑(如果你觉得有必要改进我的代码,我就赢了'停止你:))

1 个答案:

答案 0 :(得分:0)

最初给每个音轨赋予重量w,例如10 - 投票增加,减少它(但永远不会减少0)。然后在决定下一个要播放的曲目时: 计算所有权重的总和,生成一个介于0和此总数之间的随机数,并逐步通过0-49的轨道将它们加起来直到超过随机数。播放那曲目。

精确加权算法(例如,upvote / downvote改变多少w)当然会影响曲目(重新)出现的频率。不是苹果公司必须改变“随机”这个问题。他们早期的iPod随机播放,因为它可以随机播放相同的音轨两次(或者足够接近以便用户注意)所以他们不得不减少随机性,我认为这也意味着通过最近播放音轨的方式改变了音量 - 在这种情况下,在选择下一曲目时也将考虑自上次播放以来的时间。确保你能够覆盖所有人在这些情况下向所有人投票49(或者如果他们想要保持沉默的全部50个)。或许这就是你想要的......