Вы можете использовать идею, которую я имел для моего вопроса здесь: Generating non-consecutive combinations, по сути, требуя, чтобы вы разрешили только случай M = 0.
Если вы хотите пропустить описание, алгоритм будет указан в конце сообщения, который не имеет непредсказуемых циклов и т. Д., И гарантированно будет O (N log N) времени (было бы O (N), если не для этапа сортировки).
Long Описание
Для того, чтобы уменьшить общий М случай к М = 0 случае, каждой из возможных комбинаций (с «aleast М ограничение») в комбинации без «по крайней мере, 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
Вы должны показать свои усилия. – MarcinJuraszek
Да, я отправлю свой anser в код C#, я бы хотел увидеть образцы кода. –
Что делать, если в W есть меньше, чем N событий, все M? Следует ли удалить ограничение M, чтобы можно было выбрать N событий? – mbeckish