Java Генерация случайных чисел в цикле for

Я создаю программу для игры в блэкджек и пытаюсь раздать игрокам случайные карты в начале программы. Это функция, которую я написал на Java для первоначальной раздачи карт игрокам.

public static int[][] initDeal(int NPlayers)
    {
        int hands[][] = new int[NPlayers][2];

        for(int a = 0; a<NPlayers; a++)
        {

            hands[a][0] = (int)Math.round((Math.random() * 13))-1;
            hands[a][1] = (int)Math.round((Math.random() * 13))-1;

        }
        return hands;
    }

Я думаю, что есть проблема со случайным методом и циклом for, так как хотя две карты для каждого игрока генерируются случайным образом, всем игрокам раздаются одинаковые карты.


person johor    schedule 04.10.2013    source источник
comment
Какой у Вас вопрос?   -  person Masudul    schedule 04.10.2013
comment
На вашем месте я бы заменил ваш многомерный массив на список или массив Hand объектов или что-то в этом роде. Сделает все намного чище.   -  person christopher    schedule 04.10.2013
comment
Почему вы не используете java.util.Random.nextInt(13) ?   -  person Mureinik    schedule 04.10.2013
comment
@Masud генерирует два случайных числа, но одни и те же два для каждого экземпляра цикла for. если NPlayers равно 2, руки[0][0] и руки[1][0] совпадают, а руки[0][1] и руки[1][1] совпадают. Это означает, что всем игрокам раздаются одинаковые карты.   -  person johor    schedule 04.10.2013
comment
Я не получаю одинаковые руки для каждого игрока. Вы уверены, что правильно читаете результирующий массив?   -  person kiheru    schedule 04.10.2013
comment
@Mureinik Я пробовал, и это тоже не сработало   -  person johor    schedule 04.10.2013
comment
Ваш код отлично работает на ideone. Вот ссылка.   -  person christopher    schedule 04.10.2013
comment
Мне просто интересно, существует ли тег blackjack в SE)   -  person rook    schedule 04.10.2013


Ответы (2)


Вам нужно иметь «колоду» карт или что-то в этом роде, случайным образом перетасовать их, а затем раздать игрокам, удалив их из колоды.

В противном случае вы можете сдать одну и ту же карту дважды, что невозможно в реальной жизни. (Хотя можно использовать и большие колоды.)

public class Card {
    public enum Suit {HEART, DIAMOND, CLUB, SPADE};
    public int getValue();         // Ace, Jack, Queen, King encoded as numbers also.
}

public class Deck {
    protected List<Card> cardList = new ArrayList();

    public void newDeck() {
       // clear & add 52 cards..
       Collections.shuffle( cardList);
    }
    public Card deal() {
        Card card = cardList.remove(0);
        return card;
    }
}

Если/когда вам нужно генерировать случайные целые числа, вы должны использовать усечение, а не округление. В противном случае нижнее значение будет иметь только половину желаемой вероятности.

int y = Math.round( x)
0   - 0.49   ->    0         // only half the probability of occurrence!
0.5 - 1.49   ->    1
1.5 - 2.49   ->    2
..

Нет функции Math для усечения, просто приведите к int.

int faceValue = (int) ((Math.random() * 13)) + 1;

Или вы можете использовать для этого функцию Random.nextInt(n).

Random rand = new Random();
int faceValue = rand.nextInt( 13) + 1;

Заполнить бланки.

person Thomas W    schedule 04.10.2013

Попробуйте использовать nextInt(n) класса java.util.Random. Где n = 13. Но судя по всему проблема в другом. Функция действительно возвращает случайные значения, но вы не используете ее должным образом где-то еще.

person Aneesh    schedule 04.10.2013