0

カードのデッキの二重配列リストを持つプログラムを作成しています。この 1 つのデッキから配られる 2 つの「手」があります。5 枚のカードを格納する二重配列である「comHand」に 5 枚の固有のカードを配る必要があります。最初の [] は配られるカードの繰り返し (1 枚目のカード、2 枚目のカードなど) を格納し、2 番目の [] はカードのスーツを [0] に格納し、カードの番号を [1] に格納します。

コードを単純化して、3 つの固有のドローを取得できるようにしました。スーツは 1 つだけで、選択できる数字は 3 つだけです。私のコードは /// の上で正常に動作します (2 つの数値は常に一意です)。ただし、以下のコードでは一意の番号が得られない場合があります。これがなぜなのかを理解する助けを得ることができますか?

        int comHand [][] = new int [5][2];
        card1 = (int) (Math.random()*1);
        card2 = (int) (Math.random()*3);

        comHand[0][0] = card1;
        comHand[0][1] = card2;

        card1 = (int) (Math.random()*1);
        card2 = (int) (Math.random()*3);

        while (card1 == comHand[0][0] && card2 == comHand[0][1]){
            card1 = (int) (Math.random()*1);
            card2 = (int) (Math.random()*3);}

        comHand[1][0] = card1;
        comHand[1][1] = card2;

        ///

        card1 = (int) (Math.random()*1);
        card2 = (int) (Math.random()*3);

        while (card1 == comHand[0][0] && card2 == comHand[0][1]){
            card1 = (int) (Math.random()*1);
            card2 = (int) (Math.random()*3);}
        while (card1 == comHand[1][0] && card2 == comHand[1][1]){
            card1 = (int) (Math.random()*1);
            card2 = (int) (Math.random()*3);}

        comHand[2][0] = card1;
        comHand[2][1] = card2;
4

3 に答える 3

1

while ループの条件が間違っているようです。|| 試してみてください || それ以外の &&:

 while (card1 == comHand[0][0] || card2 == comHand[0][1]) {
            card1 = (int) (Math.random()*1);
            card2 = (int) (Math.random()*3);
 }

「すべてが機能するまで Math.random() を繰り返す」というアルゴリズムは適切ではないため、別のアプローチを試してみます。アルゴリズムが完了する必要があるステップの数を予測することは困難です (また、アルゴリズムが常に終了するかどうかも予測できません)。

int 配列の代わりにカードにオブジェクトを使用します。Math.random (または Random) を使用してコレクションからカードを選択し、選択したカードをそのコレクションから削除します。そうすれば二度と選ばれません。または、デッキを構築し、シャッフルして、デッキから一番上のカードをポップするだけです。これは非常に簡単に実装できます。

于 2012-12-05T11:07:19.037 に答える
1
    int comHand [][] = new int [5][2];
    ArrayList<Integer> cards = new ArrayList<Integer>();
    int totalCards = 52; //Cards in a pack
    for(int x = 1; x <= totalCards; x++)
    {
        cards.add(x);
    }
    //Repeat for 5 cards
    for(int y = 0; y < 5; y++)
    {
        int selectCard = (int)(Math.random()*cards.size()-1);
        comHand[y][0] = cards.get(selectCard) % 13; //13 cards per suit
        comHand[y][1] = cards.get(selectCard) / 13;
        cards.remove(selectCard);
    }

うまくいけば、これがあなたが求めていたものです。

于 2012-12-05T10:49:54.673 に答える
0

ランダムを使用して、連続した抽選で一意のものを取得することはできません。配列を維持し、1 つのトランザクションの描画を格納します。配列に存在する描画を取得した場合は、新しい乱数の生成を続けます

于 2012-12-05T10:42:21.160 に答える