ここで私の質問に対して私が持っていたアイデアを使用できます: Generating non-consecutive compilation、基本的に M=0 ケースのみを解決する必要があります。
説明をスキップしたい場合は、アルゴリズムは投稿の最後に記載されています。これには、予測できない while ループなどはなく、O(N log N) 時間であることが保証されています (そうでない場合は O(N) だったはずです)。ソートステップ用)。
長い説明
一般的な M のケースを M=0 のケースに還元するために、可能な各組み合わせ (「最小 M 制約」を使用) を「少なくとも M」離れた制約のない組み合わせにマッピングします。
イベントがT1, T2, .., TN
そのようなものであった場合、それらを次のようなT1 <= T2 -M, T2 <= T3 - M ...
イベントにマッピングしますQ1, Q2, .. QN
Q1 = T1
Q2 = T2 - M
Q3 = T3 - 2M
...
QN = TN - (N-1)M.
これらの Q は というプロパティを満たし、Q1 <= Q2 <= ... <= QN
マッピングは 1 対 1 です (からT
を構築できQ
、 からQ
を構築できますT
)。
したがって、必要なことは を生成しQ
(基本的にはM=0
そうです)、それらを にマップし直すだけT
です。
生成するためのウィンドウQ
が[Now, Now+12 - (N-1)M]
この問題を解決するには、ウィンドウで乱数をM=0
生成して並べ替えます。N
最終アルゴリズム
したがって、アルゴリズム全体は
Step 1) Set Window = [Start, End - (N-1)M]
Step 2) Generate N random numbers in the Window.
Step 3) Sort the numbers generated in Step 2. Call them Q1, Q2, .. , QN
Step 4) Create Ti with the formula Ti = Qi + (i-1)M, for i = 1 to N.
Step 5) Output T1,T2,..,TN