我想为许多牧师制定时间表。条件是:

  • 每个月,每个牧师都必须去另一个教堂
  • 牧师不得去他曾去过的教堂
  • 在1年内,他必须去12个不同的教堂
  • 有13个教堂和13位牧师,每个教堂每月仅接受1位牧师

  • 我不能使用random(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

    然后重复剩余的几个月:

    第三个月:
    牧师0->教堂2
    牧师1->教堂3
    牧师2->教堂4
    ...
    牧师-(n-1)->教堂-0
    牧师n->教堂1

    所有这些(O(n))都有一个非常简单的循环。如果您感到困惑,我建议您在纸上尝试使用n = 3进行循环。

    如果需要随机性,请更新您的问题。

    通过PAX编辑

    我正在删除我的答案,并对其进行投票表决,因为它是O(n),而我的扩展名至少可以满足O(n ^ 2),以进行编辑。

    您仍然可以通过将牧师0到牧师N的值索引放入经过随机排序的牧师数组中来保持随机性,从而使此解决方案至少与我的一样好。

    通过PAX结束编辑

    09-13 02:10