This week's book giveaway is in the Kotlin forum.We're giving away four copies of Kotlin in Action and have Dmitry Jemerov & Svetlana Isakova on-line!See this thread for details.
Win a copy of Kotlin in Action this week in the Kotlin forum!
programming forums Java Java JSRs Mobile Certification Databases Caching Books Engineering Languages Frameworks Products This Site Careers Other all forums
this forum made possible by our volunteer staff, including ...
Marshals:
Sheriffs:
Saloon Keepers:
Bartenders:

# 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: 12542
48
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.

 Did you see how Paul cut 87% off of his electric heat bill with 82 watts of micro heaters?