我买了几盒不同口味的茶包(A、B、C)。
我希望将它们混合在一起,这样就不会有两个连续的相同味道的袋子(ABCCAB被避免);混合是“最”随机的,即避免诸如ABCABCAC…或者阿巴巴布…密苏里密苏里密苏里密苏里密苏里密苏里密苏里密苏里。
有已知的混合算法吗?
现在,我随机地洗牌许多“abc”并连接结果,如果上一次洗牌的最新字母与新洗牌的开头相同,则交换第一个字母(…abccab=>…abcacb)。
我想我可以通过预先计算ABC的置换来改进这个算法,并在那些不以与先前置换相同字母开头的置换中画出一个置换。
我试图“谷歌”这个问题,但作为一个法语为母语的人,我可能会错过适当的关键词。
注:我之前在scicomp.stackexchange.com上发布了这个问题,并被建议复制到这里。

最佳答案

这样的做法应该管用:

amount_of_teabags_per_flavour = x
choices = {
    A : amount_of_teabags_per_flavour,
    B : amount_of_teabags_per_flavour,
    C : amount_of_teabags_per_flavour
}
previous_choice = 0
picks_left = amount_of_teabags_per_flavour * choices.size

function select_available_choices() :
    mandatory_choice = [ key from choices where key != previous_choice and value <= picks_left/2 ]
    if mandatory_choice == [] :
        available_choices = [ key from choices where key != previous_choice and value > 0 ]
    otherwise
        available_choices = mandatory_choice


result = []
select_available_choices()
while available_choices != [] :
    choice = pick_randomly_from(available_choices)
    result[last] = choice
    previous_choice = choice
    choices[choice]--
    picks_left--
    select_available_choices()

关于algorithm - 茶袋香精混合算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53559330/

10-14 08:35