0

d Collections.shuffle() メソッドについて少し質問があります。

場合:

シャッフルする必要がある2つのリストがあり、それらを1つのリストに結合/マージしてから、新しい完全なリストをシャッフルします。system.nanoTime() をシードとして使用して、Random クラスで shuffle メソッドを使用しました。

コードは次のようになります。

public List<PresentationArticle> shuffleUnionShuffleLists(List<PresentationArticle> list1, List<PresentationArticle> list2) {
    shuffleList(list1);
    shuffleList(list2);

    List<PresentationArticle> resultList = //merge/union the two lists

    shuffleList(resultList);

    return resultList;
}

public void shuffleList(List<PresentationArticle> articleList) {
    long seed = System.nanoTime();
    Collections.shuffle(articleList, new Random(seed));
}

私の質問は次のとおりです。新しい Random オブジェクトと新しい (ただしほぼ同一の) シードを使用して、メソッドが次々に実行される場合、これはリストの適切なランダム シャッフルになりますか?

このメソッドshuffleUnionShuffleLists()は、約 3 分ごとに実行されます。

4

3 に答える 3

2

デフォルトのシードは nanoTime とカウンターに基づいているため、現在のシードよりもわずかにランダムです。また、何度もシャッフルする必要はありません。ランダム化されると、複数回実行すると時間がかかります。

したがって、あなたの場合、2つのリストを一緒に追加し、 を使用してシャッフルするnew Random()か、古いリストを再利用するだけです。

public List<PresentationArticle> shuffleUnionShuffleLists(List<PresentationArticle> list1, List<PresentationArticle> list2) {
    List<PresentationArticle> list = new ArrayList<>(list1.size()+list2.size());
    list.addAll(list1);
    list.addAll(list2);
    Collections.shuffle(list);
    return list;
}

また、通常は、渡された引数を変更しないことが最善です。

于 2013-09-11T13:11:20.570 に答える
0

マージする前にリストをシャッフルする理由はありません。何かを 2 回ランダム化/シャッフルしても、それ以上ランダムにはなりません。

これはリストの適切なランダムシャッフルになりますか

はい、でもあなたはやりすぎです。

于 2013-09-11T13:11:13.100 に答える
0

まず、通常、呼び出しごとに新しい Random オブジェクトを作成するわけではありません。「よりランダム」にはなりません。第二に、数回シャッフルしてもエントロピーは増加しないため、1 回のシャッフルで十分です。

于 2013-09-11T13:11:44.790 に答える