随机播放列表(带有重复项)以避免相同的元素彼此相邻

时间:2008-12-11 02:43:14

标签: algorithm language-agnostic shuffle

我想知道是否有一种“最佳”方式来重新组合包含重复项的元素列表,以便尽可能避免使用array [i] == array [i + 1]的情况。

我正在制作加权广告显示(我可以调整任何指定广告客户的每次轮播展示次数),并希望避免连续两次出现同一广告。

5 个答案:

答案 0 :(得分:2)

这与this question非常相似。如果您在广告客户的示例中替换A,B和C,我认为您遇到了同样的问题。也许为那个建议的一些解决方案可以帮助你。

答案 1 :(得分:2)

基本随机化应该在大集合中产生足够的色散。

如果你想最大限度地减少这一点(根据集合甚至可能不需要),最简单的方法是在随机化之后绝对找到dupes并将它们移动(但你可能会创建模式)。更好的方法可能是创建包含并排欺骗的子集并重做随机化。

对于较小的一组,可能无法进行任何操作,具体取决于欺骗的数量。因此,一个非常小的集合的解决方案只是良好的基本随机化(我们回到第一句话)。

Dilbert's randon number generator

答案 2 :(得分:1)

我个人认为最简单的方法就是随机化数组,然后迭代它,直到找到2个具有相同值的元素,彼此相邻。当您在彼此旁边找到2个相同的值时,通过迭代数组将后一个值移动到数组中的另一个点,直到找到一个点,使其不在另一个相同的值旁边。如果找不到值,只需将其保留在原来的位置,然后继续使用数组的下一个元素。这可能不是最优化的解决方案,但对于较小的数据集可能会很好,并且可能是最简单的编程。

答案 3 :(得分:0)

您可能拥有的重复数量最多的是什么? 2,3,任何?

答案 4 :(得分:0)

作为参考,我的(非常)天真的方法是这样的(实际上使用LINQ / SQL调用,但这是简化的):

var advertisers = getAdvertisers();
var returnList = new List();
int totalWeight = sumOfAllAdvertisersWeight();
while (totalWeight > 0)
{
    for (int i=0; i<advertisers.Count; i++)
    {
        if (advertisers[i].Weight > 0)
        {
            returnList.add(advertisers[i]);
            advertisers[i].Weight--;
            totalWeight--;
        }
    }
}
return returnList;

这样可以避免重复,直到结束,但是之后通过returnList向后检查并且如果有任何重复拖尾,请尝试将它们放在混合中。