【发布时间】:2010-02-20 04:16:00
【问题描述】:
【问题讨论】:
-
您真的想要最有效的解决方案,还是想要可接受的有效解决方案?因为有些算法比 Fischer-Yates 提供的更高效的算法让你愿意放弃某些好的属性,比如缺乏偏见。 (并不是说下面实施的 Fischer-Yates 是公正的;它有很大的偏见。)
-
@Eric:Fischer-Yates 是公正的。正如您所指出的,下面给出的实现是不正确的。当然,如果您愿意有偏见,还有更有效的实现。例如,完全什么都不做。我真的不明白你的意思。 OP 没有指定任何内容,假设他们正在寻找统一的洗牌是合理的(IMO)。
-
那我会通过解决不同的问题来解决你的问题。为什么你必须产生 50 万个文件的洗牌?用户永远不会进入随机播放中的最后一个文件,即使他们连续几个月每天都坐在那里点击“下一个”。也就是说,为什么要预先计算整个打乱顺序?随机选择几百个(无需更换)并称其为好。这不仅要更快,而且比分配一个包含 50 万个文件名的数组并改组整个数组的内存效率要高得多。
-
@j-t-s:同意 Eric 的观点:尝试事先对如此大的文件进行洗牌似乎毫无意义(而且效率很低)。一个与 Eric 不同的建议:您可以尝试保留一个包含 10 个(或 50 个)最后播放文件的列表。对于下一个文件,您可以生成一个随机数/文件(从 1 到 1/2 百万),如果它在最后播放的 10 个(或 50 个)中,请尝试再次获取一个随机数。对于所有实际目的,这应该足够了。