n
各項目の倍数 (1 から ) が存在する可能性がある長さの一連の項目をランダム化するアルゴリズムを探していm
ます。追加の制約は、同じアイテムがk
前のアイテムのアイテム内に表示されない可能性があることです。
が 100 をはるかに下回っていると仮定しn
ても、常に解が存在m
しk
ます。役立つ場合は、入力を <item, frequency> ペアのリストに変更することもできます。
少し状況を説明するために、ゲームでミッションを生成していて、選択できる一連の目標があると仮定します。いくつかの目標は複数回出現する場合がありますが (例: 「ボスを倒す」)、互いに接近していてはならないため、単純に「バッグ」をシャッフルするのは良くありません。
リストをシャッフルし、アイテムの間隔を追跡しながら繰り返し、テストに失敗した場合は新しいシャッフルから開始できますが、コンパクトで実用的で、たとえば次のように簡単に実装できる、よりエレガントなソリューションを探していますC、C++、または JavaScript。言い換えれば、私が理解できない、または実装に苦労する可能性のある特別な言語機能や標準ライブラリ関数に依存するべきではありません。ただし、並べ替えやシャッフルなどの最も一般的なリスト操作は利用できると考えてよいでしょう。