0

カードのデッキをシャッフルしようとしています。

public void shuffle()
{
    int rand1;
    int rand2;
    Random randomGenerator = new Random();

    for (int i = 0; i < deck.size(); i++) {

        // pick a random index between 0 and size of the deck - 1
        rand1 = randomGenerator.nextInt(10);
         rand2 = randomGenerator.nextInt(10);

        // swap rand1 and rand2
        Card temp = deck.get (rand1);
        deck.set(rand1, deck.get (rand2)); 
        deck.set(rand2, temp); 
    }
}

次に、次のように述べています。

java.lang.IndexOutOfBoundsException; Index:8; size:4(in java.util.ArrayList)

どうしたの?

4

3 に答える 3

6

この行

rand1 = randomGenerator.nextInt(10);

する必要があります

rand1 = randomGenerator.nextInt(deck.size());

についても同様ですrand2

于 2013-06-22T04:43:14.563 に答える
3

別のソウルション (誰かが知る必要がある場合)

1 ~ を含むリストを作成しますdeck.size()Collection.shuffleを使用してシャッフルします。次に、リストは等確率でシャッフルされます

于 2013-06-22T05:06:36.873 に答える
2

これが宿題でない場合は、@StinePike が提案するように Collections.shuffle を使用してください。そうであれば、正しくシャッフルしていないことを知っておく必要があります。つまり、すべての結果が同じように発生するわけではありません。これは、3 つの数値をシャッフルするアルゴリズム (@Jason の修正を使用) によって生成されたヒストグラムです。

[1, 2, 3]: ***********************
[2, 3, 1]: ******************
[3, 2, 1]: **********************
[3, 1, 2]: ******************
[2, 1, 3]: **********************
[1, 3, 2]: **********************

そして、これは正しいアルゴリズムによって生成されるものです:

[1, 2, 3]: *********************
[2, 3, 1]: *********************
[3, 2, 1]: *********************
[3, 1, 2]: *********************
[2, 1, 3]: *********************
[1, 3, 2]: *********************

Collections.shuffle(deck) は正しいです。これは次のとおりです。

public static <T> void shuffle(List<T> deck){
    int rand;
    for (int i = 0; i < deck.size()-1; i++) {
        // We randomly choose rand between i (inclusive) and deck.size()-1
        rand = i + randomGenerator.nextInt(deck.size()-i);

        // swap i and rand
        T temp = deck.get(rand);
        deck.set(rand, deck.get(i)); 
        deck.set(i, temp);
    }
}

ヒストグラムを作成するために使用したコードは次のとおりです。順列は常に同じ順序で表示されるとは限りませんが、同じ順列 ([2,3,1] と [3,1,2]) は一貫して可能性が低いことに注意してください。

public static void main(String[] args) {
    Map<List<Integer>,Long> histogram = new HashMap<>();
    int logReps = 20;
    int scaleStar = logReps-7;
    List<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3));
    for (int i = 0; i<(1<<logReps); i++) {
        List<Integer> templist = new ArrayList<Integer>(list);
        badShuffle(templist);
        if( histogram.containsKey(templist)) {
            histogram.put(templist,histogram.get(templist)+1L);
        } else {
            histogram.put(templist,1L);
        }
    }
    for(Entry<List<Integer>,Long> entry : histogram.entrySet()) {
        System.out.print(entry.getKey()+": ");
        for (int i=0; i<(entry.getValue()>>>scaleStar); i++) {
            System.out.print("*");
        }
        System.out.println();
    }
}
static Random randomGenerator = new Random();
public static void badShuffle(List<Integer> deck){
    int rand1;
    int rand2;

    for (int i = 0; i < deck.size(); i++) {

        // pick a random index between 0 and size of the deck - 1
        rand1 = randomGenerator.nextInt(deck.size());
         rand2 = randomGenerator.nextInt(deck.size());

        // swap rand1 and rand2
        Integer temp = deck.get (rand1);
        deck.set(rand1, deck.get (rand2)); 
        deck.set(rand2, temp); 
    }
}
public static <T> void goodShuffle(List<T> deck){
    int rand;
    for (int i = 0; i < deck.size()-1; i++) {
        // We randomly choose rand between i (inclusive) and deck.size()-1
        rand = i + randomGenerator.nextInt(deck.size()-i);

        // swap i and rand
        T temp = deck.get(rand);
        deck.set(rand, deck.get(i)); 
        deck.set(i, temp);
    }
}
public static void libraryShuffle(List<Integer> deck){
    Collections.shuffle(deck);
}
于 2013-06-22T06:31:23.733 に答える