0

N 個の要素を持つリストがあり、その順序をランダム化したい。

できれば最小限の計算で、メモリを使い切ることができます (合計を複製します)。

これまでのところ、私は思いついた:

  • 新しい空のリストを作成し、元のリストから最初の要素を取得し、それを新しいリストのランダムな位置に挿入します。桁数は O(N*N) のように見えますが、余分なメモリは使用されません。
  • 新しいArrayList(容量N)を作成します(したがって、アクセスはO(1)です)、新しいhashSetを作成し、可能なすべての位置(N)を挿入し、元のリストの最初の要素を取得して、新しいarrayListのランダムな位置に挿入しますti が使用されているため、hashSet からこの位置を削除します。
  • 新しい HashSet を作成し、すべての要素をこの hashSet に追加し、セットを反復処理して新しい List を作成し、hashSet 内の順序がランダムであることを期待します。

最も安価なのは 3 番目のオプションのようですが、結果がどれほどランダムになるかはわかりません。助言がありますか?

4

3 に答える 3

10

Collections.shuffle(list);あなたが探しているもの。

于 2013-09-27T12:16:07.820 に答える
7

リストをシャッフルする最良の方法は、標準ライブラリ メソッドを使用することCollections.shuffleです。

List lst = getListFromSomewhere();
Collections.shuffle(lst);

自分でやりたい場合は、Fisher-Yates shuffle algorithmを読んでください。

于 2013-09-27T12:16:17.570 に答える