2016-03-29 5 views
-3

Я студент и посередине среднего проекта. Я не ищу, чтобы люди кодировали это для меня, но мне нужна помощь с его частью. Я пытаюсь сделать игру в блэкджек, и для этого я хочу установить список из 52 целых чисел [1,1,1,1,2,2,2,2 .....] по одному для каждой карты в колоде , Но как взять случайное число из списка и отменить его? Как обычная колода, как только вы берете карту, вы не можете ее перерисовать. Я знаю, что a может установить случайный параметр [n = rand()% 11 + 1] для программы, но я хочу идти выше и выше, чтобы получить AСлучайные номера из списка предустановок

ответ

-1

Вы можете использовать алгоритм перетасовки, например: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle. Перемешивание Fisher-Yates начинается с массива, затем он переключает каждый элемент массива со случайным элементом из массива. Также можно удалять элементы по одному, но это сложнее. Вы можете удалять элементы по одному случайным образом, используя двоичное дерево. Храните общее количество элементов под каждым узлом. Каждый раз, чтобы удалить элемент, создайте случайное число, большее или равное 0, и меньшее количество оставшихся элементов. Начните с корня. Перейдите к левому ребёнку, если a меньше количества предметов под левым ребенком. В противном случае пусть a будет a- и переходит в правый ребенок. Сделайте это рекурсивно. Но удаление предметов один за другим сложнее. Лучше всего использовать алгоритм перетасовки.

1

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

Таким образом, вы случайная функция генерации индекса будет:

rand_index = rand() % array_size_valid;

1

Вот тривиальным образом: Скажем у вас есть массив, содержащий 52 целых чисел:

int deck[52]; 

и вы инициализировали его до нужного значения, например 1, 1, 1, 1, 2, 2, 2, 2, .....

Когда карта нарисована, установите соответствующий массив e lement до -1 (или любое другое значение, чем оригинальные):

int drawCard(int deck[]) 
{ 
    do{ 
     int randIndex = rand() % 52; 
    } while(deck[randIndex] == -1); 

    int drawnCard = deck[randIndex]; 
    deck[randIndex] = -1; 
    return drawnCard; 
} 

Хотя этот подход не может быть достаточно эффективным, он работает, так что я думаю, что это может быть полезно для начинающих, как вы.

+0

Именно то, что я искал, спасибо. – jojobuddy13

+0

@ jojobuddy13 Пожалуйста, примите этот ответ, если вы считаете, что он решает вашу проблему :) –

+0

У этого есть возможность войти в бесконечный цикл. –

Смежные вопросы