随机/随机播放列表

时间:2016-04-01 18:24:06

标签: delphi arraylist random delphi-5

我有一个过滤的音乐标题表,并希望随机播放它们。我尝试使用随机,但通常在所有其他游戏播放一次之前播放相同的游戏。

我尝试使用一个混洗数组(我在这里找到了这个方法)然后调用了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不是连续的。我不想扫描Filtered Table以获取所有可用的AutoInc值,然后将其洗牌,除非我真的需要,因为Table可能非常大。

是否有任何聪明的方法可以随机播放播放,直到每个标题播放一次才会重复播放?我尝试在记录中使用布尔字段来表示"播放,"但是在接下来的一轮洗牌之前我必须扫描整个桌子以清除它们。

过滤表可能会被多次播放,并且我希望每次完整迭代都有一个新的洗牌顺序。

2 个答案:

答案 0 :(得分:1)

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

可能的优势:

  1. 无需扫描已过滤的表格以为其记录分配增量值
  2. 更改过滤器不需要您重新调整列表。相反,过滤器添加的歌曲将变为可用。那就是如果他们还没有被跳过。更新过滤器删除的歌曲将变得不可用。
  3. 可能的缺点:

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

答案 1 :(得分:0)

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