0

というパッケージにLotSelectionとの2 つのクラスがあります。と の 2 つのメソッドがあります。0 から 49 までの 50 個の整数の ArrayList を返し、それをスクランブルすることを意図しています。LotPool() で生成された ArrayList からの最初の 6 つの整数を含む 6 要素の配列を作成するためのものです。LotGenlotterynumberselectorLotSelectionLotPool()WinningSequence()LotPool()WinningSequence()

のコードですLotSelection

package lotterynumberselector;

import java.util.ArrayList;
import java.util.Collections;

public class LotSelection {

ArrayList<Integer> LotPool() {
    ArrayList<Integer> sequencedraw = new ArrayList<Integer>();
    for(int i = 0; i < 49; i++) {
          sequencedraw.add(i);
    }
    Collections.shuffle(sequencedraw);
    return sequencedraw;
}

int[] WinningSequence() {
    int[] WinningSequence = new int[6];
    int j = 0;
    while (j < 6) {
        WinningSequence[j] = LotPool().get(j);
        j++;
    }
    return WinningSequence;
}

}

の目的は、 によって作成された出力が期待されるタスクを実行しているLotGenかどうかをテストすることです。LotSelectionしかし、WinningSequence() からの出力は LotPool() から作成された最初の 6 つの数値と一致しませんでした。LotGenまたはのコードがLotSelection予期しない結果を生み出しているためかどうかはわかりません。LotPool()50 要素の ArrayList を 1 つ作成し、別の ArrayList をWinningSequence()作成しているため、異なる 50 要素の ArrayList から配列を作成しているためだと思わLotPool()れますが、よくわかりません。

のコードは次のLotGenとおりです。

package lotterynumberselector;

import java.util.ArrayList;
import java.util.Arrays;

public class LotGen {

public static void main(String [] args) {

    LotSelection a = new LotSelection();
    ArrayList<Integer> LotPool = new ArrayList<Integer>();
    LotPool = a.LotPool();
    System.out.println(LotPool);

    int[] WinSeq = new int[6];
    WinSeq = a.WinningSequence();
    System.out.println(Arrays.toString(WinSeq));

}

}
4

4 に答える 4

1

勝利シーケンス メソッドで LotPool() メソッドを呼び出します。LotPool は毎回新しい ArrayList を作成します。

コンストラクターで 50 個の整数を初期化するようにコードをリファクタリングし、二度とそれを行いません。LotPool() を単純な getter メソッドにして、配列リストを返します。

于 2013-08-19T00:53:13.290 に答える
0

の単一引数バージョンは、Collections.shuffle呼び出すたびに異なるランダム シーケンスを生成します。繰り返し可能な結果を​​得るには、独自の乱数発生器を渡し、シードを適切に処理する必要があります。

このようにすることもできますが、他のポスターで指摘されているように、これはまだ恐ろしく非効率的です.

public class LotSelection {

ArrayList<Integer> LotPool(long seed) {
    ArrayList<Integer> sequencedraw = new ArrayList<Integer>();
    for(int i = 0; i < 49; i++) {
          sequencedraw.add(i);
    }
    Collections.shuffle(sequencedraw, new Random(seed));
    return sequencedraw;
}

int[] WinningSequence(long seed) {
    int[] WinningSequence = new int[6];
    int j = 0;
    while (j < 6) {
        WinningSequence[j] = LotPool(seed).get(j);
        j++;
    }
    return WinningSequence;
}

}
于 2013-08-19T00:52:41.190 に答える
0

この理由は非常に単純です。 によって返されたリストの新しい番号を選択するたびに、再度WinningSequence呼び出しますLotPool。一度呼び出して、結果を変数に格納し、ループのたびに再度使用する必要があります。

于 2013-08-19T00:53:15.660 に答える
0

WinningSequence メソッドの問題は次のとおりです。

    WinningSequence[j] = LotPool().get(j);

配列に追加するたびにリストを取得しています。これにより、リストの最初の要素のみがフェッチされます。これをループから一度だけ実行する必要があります。

WinningSequence メソッドを更新する方法は次のとおりです。

int[] WinningSequence() {
    int[] WinningSequence = new int[6];
    int j = 0;
    ArrayList<Integer> LotPool = LotPool().get(j)
    while (j < 6) {
        WinningSequence[j] = LotPool .get(j);
        j++;
    }
    return WinningSequence;
}
于 2013-08-19T00:53:56.113 に答える