Jump to content
  • Advertisement

Archived

This topic is now archived and is closed to further replies.

omegasyphon

shuffling a deck of cards

This topic is 5961 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

ok i have come up with this easy algorithm for shuffling a deck of cards, but it is horrendesly slow and not sure how to speed it up or what a better solution is. basically its like this: i have an array of 52 elements i seed the first element with a random variable of 2-52 and it then goes through the deck searching to see that the next random variable it creates isnt already in it. now this works fine but on a slow processor under 30mhz its dam slow.

Share this post


Link to post
Share on other sites
Advertisement
An abstract demonstration of a better method:

  
unsigned int Deck[52], a;

/* Fill the array with one of each card type */
for(a=0; a<52; ++a)
Deck[a] = a;

/* Swap the cards X amount of times */

srand(time(NULL));
for(a=0; a<SOME_VALUE; ++a) {
unsigned int first, second, temp;

first = (unsigned)((rand()/(float)RAND_MAX)*52.0f);
second = (unsigned)((rand()/(float)RAND_MAX)*52.0f);

temp = Deck[first];
Deck[first] = Deck[second];
Deck[second] = temp;
}

I''m pretty sure you can see what I''m doing from that example.

Share this post


Link to post
Share on other sites

A simple alternative idea (Null and Void''s method is probably better in terms of clarity and data visits):


int CompareFn( const void *elem1, const void *elem2 )
{
return rand() - (RAND_MAX/2);
}

void Shuffle()
{
srand(...);
qsort( Deck, 52, sizeof(CARD), compareFn );
}


the idea being to sort the cards in a random order - it could also be trivially modified to simulate different types of shuffle.

--
Simon O''Connor
Creative Asylum Ltd
www.creative-asylum.com

Share this post


Link to post
Share on other sites
Here''s how I''ve always done it. Works just fine for me.

for (BYTE i=0; i<52; i++)
SwapCards(i, rand()%52);

If you''re worried about it not making things random enough, run it a hundred times. It''s so fast that your user won''t notice the difference

---
John Hattan
The Code Zone
Sweet software for a saturnine world

Share this post


Link to post
Share on other sites
quote:
Original post by S1CA

A simple alternative idea (Null and Void''s method is probably better in terms of clarity and data visits):


int CompareFn( const void *elem1, const void *elem2 )
{
return rand() - (RAND_MAX/2);
}

void Shuffle()
{
srand(...);
qsort( Deck, 52, sizeof(CARD), compareFn );
}


the idea being to sort the cards in a random order - it could also be trivially modified to simulate different types of shuffle.

--
Simon O''Connor
Creative Asylum Ltd
www.creative-asylum.com



hmmm... I think qsort has problems with compare not always returning the same values, it never finishes sorting and eventually causes a stack overflow. Haven''t tried that exact method but I''m pretty sure. Null and Void had the method of choice.

Share this post


Link to post
Share on other sites
I think this is a different form of Michaelson''s post.

for ( int i = 0; i < 52; i++ )
{
int nRandomCard = (rand()%(52-i))+i;
SWAP( i, nRandomCard );
}

basically, you remove a random card from the original deck and add it to a new deck that you are creating at the top of the deck. The complicated line (rand()%(52-i))+i makes it so that you pick a random number in the half of the deck you haven''t shuffled yet.

Share this post


Link to post
Share on other sites
Tsk, tsk, tsk, why reinvent the wheel ?


#include <algorithm>

Card deck[52];
std::random_shuffle( deck, deck+52 );


Note: that version uses rand() internally. Make sure to call srand().

[edited by - Fruny on March 25, 2002 11:24:56 PM]

Share this post


Link to post
Share on other sites

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!