Choosing 5 card hands from a 52 card deck
10 views (last 30 days)
Show older comments
My code so far is:
c = ['A23456789TJQK']';
s = ['HDSC']';
d = [repmat(c,4,1),repmat(s,13,1)];
for i=1:10;
y(1,i) = datasample(d,5,'Replace',false);
end
I can create the deck vector and have it take one 5 card hand sample, but I'm having trouble making it take 5 card hands for i amount of times. I essentially want a y matrix that is size 5 x i.
0 Comments
Accepted Answer
Walter Roberson
on 3 Jul 2015
numhands = 20;
per_hand = 5;
c = ['A23456789TJQK']';
s = ['HDSC']';
[C,S] = ndgrid(c,s);
cards = cellstr( [C(:), S(:)]);
[~, dealorder] = sort(rand(numhands,52));
and now
y = cards(dealorder(:,1:per_hand));
Note that the result would be a 20 x 5 cell array of strings.
More Answers (1)
Image Analyst
on 3 Jul 2015
Try this:
% Define parameters.
numberOfHands = 10 % i.e. # persons playing cards.
numCardsPerHand = 5 % # cards each person holds
numCardsToDeal = numberOfHands * numCardsPerHand;
if numCardsToDeal <= 52
% We have enough cards to deal.
% Get the cards. Each card is numbered from 1 - 52
cards = randperm(52, numCardsToDeal);
% Reshape into numberOfHands rows high
% by numCardsPerHand columns wide.
% So each row is one hand.
hands = reshape(cards, numberOfHands, numCardsPerHand)
else
% we don't have enough cards to deal.
uiwait(warndlg('Not enough cards'));
end
The cards are numbered 1-52. That will be easier to use in whatever code follows this than if you had a character array and also had to have a "suit" array to keep track of what suit each number was.
2 Comments
Image Analyst
on 4 Jul 2015
Joey, this is a very simple Monte Carlo simulation (no pun intended). Hopefully this is not homework and you got something very similar to this:
% Define parameters.
numberOfHands = 200000 % i.e. # persons playing cards.
numCardsPerHand = 5 % # cards each person holds
fourOfAKind = 0;
royalFlushes = 0;
% Monte Carlo simulation:
for h = 1 : numberOfHands
% Get the cards. Each card is numbered from 1 - 52
% 2 is card 1, and Ace is card 13 (for ease of testing for Royal Flushes).
cards = randperm(52, numCardsPerHand);
% Check for four of a kind
sameSuit = (min(cards) >= 1 && max(cards) <= 13) || ...
(min(cards) >= 14 && max(cards) <= 26) || ...
(min(cards) >= 27 && max(cards) <= 39) || ...
(min(cards) >= 40 && max(cards) <= 52);
if sameSuit
fourOfAKind = fourOfAKind + 1;
end
% Check for a straight
% An easy exercise left for Joey.
% Check for Royal flush
royalFlush = (min(cards) == (13 - numCardsPerHand + 1) && max(cards) == 13) || ...
(min(cards) == (26 - numCardsPerHand + 1) && max(cards) == 26) || ...
(min(cards) == (39 - numCardsPerHand + 1) && max(cards) == 39) || ...
(min(cards) == (52 - numCardsPerHand + 1) && max(cards) == 52);
if royalFlush
royalFlushes = royalFlushes + 1;
end
fprintf('Done with hand #%d of %d\n', h, numberOfHands);
end
fprintf('Found %d 4 of a kind in %d hands\n', fourOfAKind, numberOfHands);
fprintf('Percentage of 4 of a kind = %f%%\n', 100*fourOfAKind/numberOfHands);
fprintf('Found %d Royal Flushes in %d hands\n', royalFlushes, numberOfHands);
fprintf('Percentage of Royal Flushes = %f%%\n', 100*royalFlushes/numberOfHands);
See Also
Categories
Find more on JSON Format in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!