我想为许多牧师制定一份时间表.条件是:
每个月,每个牧师都必须去另一个教堂,
牧师不得去他所来的同一个教堂
在1年内,他必须去12个不同的教堂
有13个教堂和13个牧师,每个教堂每个月只接受1个牧师
我不能随意使用(1到12),因为牧师有可能去同一个教堂(有机会他去同一个教堂的可能性为8.3%).
我想让他去同一个教堂的机会很小(约3%或更少).
你的条件不要求随机选择下一个教会给定牧师.难道你不能遍历教堂名单吗?
也就是说,为每个牧师分配一个0-12的数字.为每个教会分配一个0-12的数字.第一个月:
第0个月:
牧师-0->教堂-0
牧师-1->教堂-1
牧师2 - >教堂2
...
牧师n - >教堂-n
下个月,只需增加一个计数器(带环绕)
第1个月:
牧师0 - >教堂1
牧师1 - >教堂2
牧师2 - >教堂3
...
牧师 - n - >教堂-0
然后重复剩下的几个月:
第3个月:
牧师 -0- >教堂2
牧师1 - >教堂3
牧师2 - >教堂4
... 牧师 -
(n-1) - >教堂-0
牧师-n- - >教堂-1
所有这一切都有一个非常简单的循环(O(n)).如果它让你感到困惑,我建议用n = 3来试试纸上的循环.
如果要求随机性,请更新您的问题.
由PAX编辑
我正在删除我的答案并对此进行投票,因为它是O(n)并且我的扩展以满足编辑的要求至少为O(n ^ 2).
你仍然可以通过将pastor-0到pastor-N值索引变成一个随机排序的牧师数组,使得这个解决方案至少和我的一样好.
由PAX结束编辑