필터 지우기
필터 지우기

Choosing 5 card hands from a 52 card deck

조회 수: 12 (최근 30일)
Joey
Joey 2015년 7월 3일
댓글: Image Analyst 2015년 7월 4일
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.

채택된 답변

Walter Roberson
Walter Roberson 2015년 7월 3일
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.

추가 답변 (1개)

Image Analyst
Image Analyst 2015년 7월 3일
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
Joey
Joey 2015년 7월 3일
편집: Joey 2015년 7월 3일
The way I want it to work though is after every 5 card draw, it replaces those 5 cards and then redraws 5 cards again. The goal is to eventually figure out the percent chance of getting certain hands like "royal flush" or "four of a kind" etc.
Image Analyst
Image Analyst 2015년 7월 4일
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);

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Custom Training Loops에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by