Win a copy of Design for the Mind this week in the Design forum!

# picking a random card from a deck

Gayatri Sinha
Ranch Hand
Posts: 34
I was wondering how we can programmatically pick a random card from a deck of 52 cards.
For simplification let the cards be integers from 1 to 52.
A card is randomly picked and set aside. So in the next round we will have only 51 cards. and so on...

Can someone solve this for me please, I couldn't

Stan James
(instanceof Sidekick)
Ranch Hand
Posts: 8791
A common way to do this is to "shuffle" the 52 cards into random order. Then you can just take the first one, second one, etc. This is so common that Sun built a shuffle method into Collections. Will that do it for you?

Gayatri Sinha
Ranch Hand
Posts: 34
Thanks, ya its works.
Are there any more other ways to do this?

fred rosenberger
lowercase baba
Bartender
Posts: 12097
30
sure... put all 52 into an array. pick one at random. swap it with the last.

then, pick one of the 51. swap it with the second to last, etc.

or...

have an array of 52 elements that keeps track of whether a card has been selected or not. pick a number from 1-52, and check to see if it's marked. if not, you're good. if it has, pick another number. note that it may take a while before you hit that last card...

Jim Yingst
Wanderer
Sheriff
Posts: 18671
[fred]:

sure... put all 52 into an array. pick one at random. swap it with the last.

then, pick one of the 51. swap it with the second to last, etc.

Note that this is pretty much what Collections.shuffle() does. Check out the source code. If you don't usually need the entire deck to be shuffled, you could modify this to just shuffle one card, each time you need a new card.

Regarding Fred's second suggestion, you could also use a Set (e.g. HashSet) rather than an array. For only 52 cards, using an array is extremely sensible. However for a similar problem with a much larger number of random elements, a HashSet may make more sense. E.g. if there are too many elements to hold them all in memory, but you draw only a few of them. The array could take much more memory than the HashSet.

 Don't get me started about those stupid light bulbs.