根据特定条件随机选择行
Randomly SELECTing rows based on certain criteria
我正在为办公室开发一个媒体播放器,到目前为止还不错,但我想添加一个投票系统(有点像潘多拉大拇指 up/thumbs 向下)
为了构建播放列表,我目前正在使用以下代码,它会随机抽取 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/",""))
我正在尝试找出使用 up/down 选票的最佳方式。
我希望看到更少的反对票和更多的赞成票。
我不追求直接代码,因为我对 python 很满意,更多的是我无法完全理解的逻辑(也就是说,如果你觉得需要改进我的代码,我不会阻止你:) )
最初给每条轨道一个权重w,例如10 - 投票赞成会增加它,而投票会减少它(但永远不会为 0)。然后在决定接下来播放哪首曲目时:
计算所有权重的总和,生成一个介于 0 和这个总和之间的随机数,然后逐步遍历 0-49 的轨道,将它们的 w 相加,直到超过随机数。播放该曲目。
确切的加权算法(例如 upvote/downvote 改变 w 的程度)当然会影响轨道(重新)出现的频率。 Apple 难道不是不得不更改其早期 iPod 的 'random' 随机播放,因为它可以随机播放同一首曲目两次(或足够接近以让用户注意到)所以他们不得不降低随机性,这我认为还意味着通过最近播放曲目来改变权重 - 在这种情况下,在选择下一首曲目时也会考虑自上次播放以来的时间。确保你涵盖了每个人都对 49 个(如果他们想要沉默,则全部 50 个)的曲目投反对票的最终情况。或者这就是您想要的...
我正在为办公室开发一个媒体播放器,到目前为止还不错,但我想添加一个投票系统(有点像潘多拉大拇指 up/thumbs 向下)
为了构建播放列表,我目前正在使用以下代码,它会随机抽取 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/",""))
我正在尝试找出使用 up/down 选票的最佳方式。 我希望看到更少的反对票和更多的赞成票。
我不追求直接代码,因为我对 python 很满意,更多的是我无法完全理解的逻辑(也就是说,如果你觉得需要改进我的代码,我不会阻止你:) )
最初给每条轨道一个权重w,例如10 - 投票赞成会增加它,而投票会减少它(但永远不会为 0)。然后在决定接下来播放哪首曲目时: 计算所有权重的总和,生成一个介于 0 和这个总和之间的随机数,然后逐步遍历 0-49 的轨道,将它们的 w 相加,直到超过随机数。播放该曲目。
确切的加权算法(例如 upvote/downvote 改变 w 的程度)当然会影响轨道(重新)出现的频率。 Apple 难道不是不得不更改其早期 iPod 的 'random' 随机播放,因为它可以随机播放同一首曲目两次(或足够接近以让用户注意到)所以他们不得不降低随机性,这我认为还意味着通过最近播放曲目来改变权重 - 在这种情况下,在选择下一首曲目时也会考虑自上次播放以来的时间。确保你涵盖了每个人都对 49 个(如果他们想要沉默,则全部 50 个)的曲目投反对票的最终情况。或者这就是您想要的...