【问题标题】:Random / Shuffle playlist随机/随机播放列表
【发布时间】:2016-04-01 18:24:05
【问题描述】:

我有一个过滤后的音乐标题表,想随机播放它们。我尝试使用 Random,但通常在播放所有其他标题之前播放相同的标题。

我尝试使用洗牌数组(我在这里找到了方法),然后调用 Record 的匹配 AutoInc 值...

procedure Shuffle(anArr : TStringList; aMax : Integer);
var
  i: Integer;
begin
  Randomize;
  for i:=0 to aMax do
    anArr.Add(IntToStr(i));
  for i := anArr.Count-1 downto 1 do
    anArr.Exchange(i,Random(i+1));
end;

但是,由于表格被过滤,AutoInc 不连续。我不想扫描过滤表中所有可用的 AutoInc 值,然后随机播放,除非我真的必须这样做,因为表可能非常大。

有没有什么聪明的方法可以随机随机播放,直到每个标题都播放一次后才重复播放?我尝试在记录中使用布尔字段来指示“已播放”,但随后我不得不扫描整个表格以在下一轮随机播放之前将它们全部清除。

过滤后的表格可能会播放多次,我希望每次完整迭代都有一个新的随机顺序。

【问题讨论】:

    标签: delphi arraylist random delphi-5


    【解决方案1】:

    为什么不简单地为非过滤表分配增量值,然后创建这些值的随机数组?您稍后要做的就是在播放下一首歌曲之前检查该歌曲是否符合设置的过滤器。如果没有,请跳到下一个。

    可能的优势:

    1. 无需扫描过滤表来为其记录分配增量值
    2. 更改过滤器不会要求您重新排列您的列表。相反,通过过滤器添加的歌曲将变为可用。也就是说,如果它们还没有被跳过。被更新的过滤器删除的歌曲就变得不可用了。

    可能的缺点:

    1. 如果过滤器跳过大量具有增量值的歌曲,查找下一首要播放的歌曲可能会导致在找到下一首符合过滤条件的歌曲之前出现小延迟。但我怀疑这很有可能发生。并且可以通过在当前歌曲仍在播放时找到下一首合适的歌曲来隐藏用户。
    2. 由于所有歌曲都被随机播放,因此无论是否使用有源过滤器,随机播放过程都会花费相同的时间。这意味着,如果您总共有大量歌曲,则可能需要一些时间。但即使这样也可以通过提供多线程洗牌来解决,其中每个胎面只会洗牌列表的一部分。现在它不会返回相同的结果,但我猜列表仍然会被打乱。

    【讨论】:

      【解决方案2】:

      只需使用过滤数据集中的 AutoInc 字段值(而不是连续索引)填充 anArr,然后随机排列列表。

      【讨论】:

      • 您的回答应该解决问题已经对您的建议提出的反对意见:“我不想扫描过滤表中所有可用的 AutoInc 值,然后随机播放,除非我真的必须这样做因为表格可能非常大。”
      猜你喜欢
      • 2023-01-23
      • 2012-03-11
      • 1970-01-01
      • 2014-08-29
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      相关资源
      最近更新 更多