aspose file tools*
The moose likes Programming Diversions and the fly likes picking a random card from a deck Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Other » Programming Diversions
Bookmark "picking a random card from a deck" Watch "picking a random card from a deck" New topic
Author

picking a random card from a deck

Gayatri Sinha
Ranch Hand

Joined: Feb 13, 2006
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

Joined: Jan 29, 2003
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?


A good question is never answered. It is not a bolt to be tightened into place but a seed to be planted and to bear more seed toward the hope of greening the landscape of the idea. John Ciardi
Gayatri Sinha
Ranch Hand

Joined: Feb 13, 2006
Posts: 34
Thanks, ya its works.
Are there any more other ways to do this?
fred rosenberger
lowercase baba
Bartender

Joined: Oct 02, 2003
Posts: 11314
    
  16

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...


There are only two hard things in computer science: cache invalidation, naming things, and off-by-one errors
Jim Yingst
Wanderer
Sheriff

Joined: Jan 30, 2000
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.


"I'm not back." - Bill Harding, Twister
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: picking a random card from a deck