Random 在整个随机列表中均匀分布重复项(播放列表洗牌)

Random 在整个随机列表中均匀分布重复项(播放列表洗牌),random,shuffle,playlist,Random,Shuffle,Playlist,我需要洗牌大约1000串“title-artist”的形式,其中一些标题重复(比如“寂静之夜”),一些艺术家重复(比如“Bing Crosby”)。没有“title-artist”组合重复,也没有额外的连字符 我想以一个列表结束,在相同的标题和相同的艺术家之间尽可能多的空间 我倾向于将整个列表随机洗牌数千次,并在最接近的一对相同重复之间保持最大的距离 另一种蛮力:洗牌(仅一次),然后重复数吨次:找到最接近的一对,并将其中一个换成不同的随机点 一个看起来比另一个好?有什么比这更聪明但更简单的吗 非

我需要洗牌大约1000串“title-artist”的形式,其中一些标题重复(比如“寂静之夜”),一些艺术家重复(比如“Bing Crosby”)。没有“title-artist”组合重复,也没有额外的连字符


我想以一个列表结束,在相同的标题和相同的艺术家之间尽可能多的空间

我倾向于将整个列表随机洗牌数千次,并在最接近的一对相同重复之间保持最大的距离

另一种蛮力:洗牌(仅一次),然后重复数吨次:找到最接近的一对,并将其中一个换成不同的随机点

一个看起来比另一个好?有什么比这更聪明但更简单的吗


非常感谢

完美的约翰·科尔曼!非常感谢。 相同的问题和建议如下:

------------编辑------------

我对我的成绩感到无比高兴

与op(me)相反,我忽略了重复的艺术家。与两个“白色圣诞节”相比,连续两个“宾·克罗斯比”真的没什么关系

我选了一首最受欢迎的歌,然后将它均匀地分布在一个无人参与的阵列上。然后是第二首最流行的歌曲,也是这样,与#1的冲突没有增加。在整个列表中重复,包括在最后一个空槽中重复0次的歌曲

因此,每一首第34首歌都是(不同的)“寂静之夜”(#1),作为一名听众,这是不可能察觉到的。每46条赛道都是“白色圣诞节”(2条,从不同的位置开始,碰撞碰撞撞到了“寂静之夜”后的1条)

对于听者来说,这是再随机不过的了,而且我总是用rand()、noise()和他们所有的姐妹来获得零次gotcha/重复

大概是这样的:

populate the result list with null's
for each unique title, sorted from greatest # of repeats -> fewest # of repeats {
    perfectSpacing = list.size() div (number of times this title repeats)
    i = random(list.size())  // random starting location for this title
    for each unique version of this title {
        while (list[i] != null) // bump past populated slots, wrapping around
            i = (i + 1) % list.size()
        list[i] = current version of the current title
        i = (i + perfectSpacing) % list.size()
        // jump the ideal distance for the next version of this title
    }
}
尽管“碰撞过去的碰撞”会带来缠绕和创建背靠背重复的风险,但数据集中的重复次数太少,不允许这样做。几乎一半的人根本不重复,而对于那些重复的人来说,从“大量重复”到“只有少量重复”的曲线下降得非常快


希望有一天能帮助别人

“我希望最后的列表在相同的标题之间和相同的艺术家之间有尽可能多的空间。”这样就不会是随机的。这将迫使这些事情集中在列表的开头和结尾。作为第一步,你需要决定你想做什么。我的直觉是,你有一个粗略的想法,但要设计一个算法,你需要一个特定的标准。第三种可能性是指定重复之间允许的最小值,并随机洗牌,直到满足阈值。一个关键点是,对于某些参数组合而言,这可能是不可能的,也可能是不太可能实现的。作为一个安全阀,有一个超时,在这种情况下返回您的第一个选项。这是一个自然的问题,任何想为播放列表编写一个令人满意的洗牌功能的人都会面临这个问题。请参阅(from)以了解其他一些想法。是否有一些示例字符串要粘贴?可能是50-100个字符串?@JohnColeman:你应该发表你的评论作为答案,也许还可以引用你链接到的部分问题。一般来说,对问题的回答不应作为评论出现。